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;
}

非常感谢所有人的所有答案,不幸的是,它们似乎都不起作用。分配 4 以考虑 null 没有任何区别。调用 scanf 而不是 scanf_s 会导致访问冲突(这很奇怪,因为程序的其余部分使用普通的 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正确调用。一种可能的解决方法是切换到调用scanf,传递最大字符串大小并检查用户输入

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

的,坚持scanf_s

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

首先,您没有足够的空间well来存储 3 个字符一个空终止符。

并且scanf_s是安全的,因为它需要(请参见此处)某些格式字符串喜欢s有长度,而您缺少这些长度。

于 2013-05-03T11:08:43.380 回答
0

分配4个字节给well,然后memset为NULL,然后试一试

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

分配4 byteswell一个终止null字符..这解决了你的问题..

char well[4];
于 2013-05-03T11:10:02.917 回答
0
scanf_s ("%s",well); 

scanf_s 需要字符串的长度:

scanf_s ("%s", well, 4);

char well[4];
于 2013-05-03T11:14:07.463 回答
0

每个存储字符串的字符数组都有一个附加字符\0作为字符串终止符。这表示字符串的结尾。因此"Yes"需要存储一个大小数组。sizeof(char)*4在您的程序中,只有前 3 个字符存储到well.因此返回一个strcmp()非零数,因此!strcmp总是0由于控制总是跳转到else。以下是工作代码:

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

int main()
{
   char well[4];// "Yes" needs sizeof(char)*4, to account for the end `\0`

   printf("Hello, are you well today? (Yes/No) ");
   scanf ("%s",well);      //Use scanf(),scanf_s() works for Uncle Gates only

       if (!strcmp(well,"Yes"))
       printf("Well...glad to hear it, so am I\n");

       else
       printf("Sorry to hear that,umm....can I take your wife out?\n");

system("PAUSE");   //This works for Uncle Gates only (not portable)
return 0;
}
于 2013-05-03T11:25:48.477 回答