我是C的新手并且在下面的程序中遇到问题。它询问人们他们是否健康并相应地显示消息。到目前为止,我已尝试使用!strcmp
,strcmp
和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以考虑空值没有区别。调用scanf而不是scanf_s会导致访问冲突(这是奇怪的,因为程序的其余部分使用普通scanf。在scanf_s中添加&#39; 4&#39;参数也没有区别。真的在这里撕裂我的头发我&# 39;我很高兴能够在行尾收到零点,但该程序似乎无法识别它。
答案 0 :(得分: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);
答案 1 :(得分:1)
首先,well
中没有足够的空间来存储3个字符和空终结符。
并且scanf_s
是安全的,因为需要(请参阅here)某些格式字符串(如s
)才能获得长度,这是您所缺少的。
答案 2 :(得分:0)
将 4 bytes
分配给well
以获取终止null
字符..这可以解决您的问题..
char well[4];
答案 3 :(得分:0)
scanf_s ("%s",well);
scanf_s需要string的长度:
scanf_s ("%s", well, 4);
和
char well[4];
答案 4 :(得分: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;
}
答案 5 :(得分:0)
将4个字节分配给well,然后将memset分配给NULL,然后尝试
char well[4];
memset(well,0,4)