我有以下程序
main()
{
char name[4] = "sara";
char vname[4] = "sara";
if(strcmp(name, vname) == 0)
{
printf("\nOK");
}
else
{
printf("\nError");
}
}
Run Code Online (Sandbox Code Playgroud)
这个程序总是打印"错误"......这里有什么问题帮助我
但如果我更改char vname [] ="sara",那么它打印出"OK"......为什么?
Jol*_*hic 20
您正在调整数组的大小,以使它们对于字符串来说太短(它们不包含空终止符的附加字符).因此,strcmp在进行比较时会超出字符串的末尾,从而产生基本上不可预测的结果.你很幸运没有得到一个段错误.
请原谅我,如果这是偏离轨道,因为我已经很久没有做过C!
main()
{
char name[] = "sara";
char vname[] = "sara";
if(strcmp(name, vname) == 0)
{
printf("\nOK");
}
else
{
printf("\nError");
}
}
Run Code Online (Sandbox Code Playgroud)
你已经为char数组指定了硬盘长度,但是在C中,字符串是空终止的,所以"sara"实际上需要len 5而不是4.
因为name并且vname不包含字符串.通过为每个字符串指定4的大小,使用4个字符的字符串作为初始化程序,您已告诉编译器只存储那4个字符而没有'\0'标记字符串结尾的空字符.
行为未定义; 你是(不)幸运的,它不仅仅是崩溃.
删除4(或更改为5):
char name[] = "sara";
char vname[] = "sara";
Run Code Online (Sandbox Code Playgroud)
编辑:这是您的程序的修改版本,修复了其他几个问题(请参阅注释).其他省略4声明name和vname,大多数更改与您的问题没有直接关系.
#include <stdio.h> /* needed for printf */
#include <string.h> /* needed for strcmp */
int main(void) /* correct declaration of "main" */
{
char name[] = "sara"; /* omit 4 */
char vname[] = "sara"; /* omit 4 */
if (strcmp(name, vname) == 0)
{
printf("OK\n"); /* \n is at the *end* of the line */
}
else
{
printf("Error\n"); /* as above */
}
return 0; /* not absolutely required, but good style */
}
Run Code Online (Sandbox Code Playgroud)