こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

C言語 コンパイルできるが実行するとエラー

非負の数字を入力してもらい表示させ、数字以外を入力した場合は終了するプログラムです↓(VC使用)
━━━━━━━━━━━━━━━━━━━━━━━━━━
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h> /* atoi使用 */
#include <ctype.h> /* isdigit使用 */

int main(void)
{
  char cx;
  int nx;

  printf("非負の整数を入力してください。:");
  scanf("%s", cx);

  if(isdigit(cx) == 0){
    printf("数字を入れてください。\n");
  }else{
    nx = atoi((const char*) cx);
  }

  printf("%d", nx);

  return 0;
}
━━━━━━━━━━━━━━━━━━━━━━━━━━

実行し文字を入力するとDebug Error!と小窓がでます。どこがおかしいのでしょうか?

投稿日時 - 2006-08-28 18:07:48

QNo.2368223

困ってます

質問者が選んだベストアンサー

コンパイルすると警告が出るはずですが、それは確認しましたか?
原因はずばりその表示されているはずの警告文の通りです。

ヒント:変数cxに注目

投稿日時 - 2006-08-28 18:17:23

お礼

ご返答ありがとうございます。
返事が遅れて申し訳ありませんでした。警告で「初期化されていないローカル変数 'cx' が使用されます」と表示されましたが、cxに文字列を代入するので初期化する必要がないと判断して無視していたのが原因の様ですね。その原因を簡単に説明してくれると助かります。

投稿日時 - 2006-09-01 17:57:08

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

ひょっとすると、入力する文字は1文字だけという暗黙の前提ですか?
scanf() の第2パラメータ以降は変数へのポインタ。
cxのアドレスを与えるには?
ヘルプなどでscanf()の使用例を確認してみてください。

投稿日時 - 2006-09-01 23:06:58

お礼

ご返答ありがとうございます。
入力する文字制限はなく、1文字でも数字以外が入ると「数字を入れてください」を表示するようにしています。scanfについてもう少し調べてみてみます。

投稿日時 - 2006-09-02 02:23:40

ANo.1

ヒントだけ...

1.
char cx
と定義しているのに、scanf関数で文字列を代入しようとしているように見える。

2.
scanfで文字列を代入する場合、scanf関数に渡すべきは代入先のポインタである

3.
atoi関数の引数はchar型ではなくconst char*型。無理やりキャストを行っても動くわけがありません。

とりあえずcxを
char cx[128]
として、
sacanf("%s", cx)
とすれば動作するでしょう。

理由はよーく考えてください。

投稿日時 - 2006-08-28 18:15:52

お礼

ご返答ありがとうございます。
返事が遅れて申し訳ありませんでした。cxをchar cx[128]と変更しても実行できず、「'isdigit' : 1 番目の引数を 'char [128]' から 'int' に変換できません。」とエラーがでてコンパイルできませんでした。そしてscanf("%s", cx);をsacanf("%s", cx);と変更しましたが、「'sacanf': 識別子が見つかりませんでした」とエラーがでました。

投稿日時 - 2006-09-01 17:46:53

あなたにオススメの質問