Strcmp in C不工作

时间:2013-05-03 11:04:20

标签: c strcmp

我是C的新手并且在下面的程序中遇到问题。它询问人们他们是否健康并相应地显示消息。到目前为止,我已尝试使用!strcmpstrcmpstrncmp,而且没有返回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;我很高兴能够在行尾收到零点,但该程序似乎无法识别它。

6 个答案:

答案 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)