0

私はCが初めてで、以下のプログラムに問題があります。人々に元気かどうか尋ね、それに応じてメッセージを表示します。これまでのところ!strcmpstrcmpを使用してみstrncmpましたが、 に対して正の値を返すものはなく、すべてステートメントifにスキップします。else構文が私には問題ないように思われるので、どこが間違っているのか教えてください。

#include "stdafx.h"
#include <stdio.h>
#include <string.h>

int main()
{
   char well[3];

   printf("Hello, are you well today? (Yes/No) ");
   scanf_s ("%s",well);
       if (!strcmp(well,"Yes")){
           printf("Glad to hear it, so am I\n");
   }
   else{
       printf("Sorry to hear that, I hope your day gets better\n");
   }   
system("PAUSE");   
return 0;
}

残念ながら、どれもうまくいかないようです。null を考慮して 4 を割り当てても違いはありません。scanf_s ではなく scanf を呼び出すと、アクセス違反が発生します (プログラムの残りの部分は単純な scanf を使用するため、これは奇妙です。scanf_s に '4' パラメータを追加しても違いはありません。行末に null がありますが、プログラムはそれを認識していないようです。

4

6 に答える 6

5

文字列"Yes"にはヌル ターミネータが含まれており、メモリ内のように見え{'Y', 'e', 's', '\0'}ます。したがって、4文字が必要なため、3要素char配列に安全に読み込むことができないためwell、少なくとも4要素を指定する必要があります

char well[4];

または、Lundinが示唆するように

#define MAX_RESPONSE (sizeof("Yes"))
char well[MAX_RESPONSE];

paxdiablo は、あなたもsscanf_s正しく呼び出していないと説明しています。ここで考えられる修正の 1 つは、 の呼び出しに切り替えscanf、最大文字列サイズを渡し、ユーザー入力をチェックすることです。

while (scanf(" %3s", well) != 1);

の、こだわりscanf_s

while (scanf_s(" %s", well, sizeof(well)-1) != 1);
于 2013-05-03T11:05:44.867 に答える
1

まず、3 文字とヌル ターミネータwellを格納するのに十分なスペースがありません。

また、長さが必要な特定のフォーマット文字列が必要なため(こちらscanf_sを参照) 、安全です。これは欠落しています。s

于 2013-05-03T11:08:43.380 に答える
0

終了文字に4 bytes割り当てます..これで問題が解決します..wellnull

char well[4];
于 2013-05-03T11:10:02.917 に答える
0

4 バイトを well に割り当ててから、memset を NULL にして、試してみてください

char well[4];
memset(well,0,4)
于 2013-05-03T11:40:30.133 に答える