2011-09-20 83 views
4

我有以下程序为什么在C中比较字符串不起作用?

main() 
{ 

    char name[4] = "sara"; 
    char vname[4] = "sara"; 

    if(strcmp(name, vname) == 0) 
    { 
     printf("\nOK"); 
    } 
    else 
    { 
     printf("\nError"); 
    } 

} 

这个程序总是打印“错误” ......问题是什么在这里帮我

,但如果我改变焦炭VNAME [] =“萨拉”的话,那打印出“OK”...为什么?

+0

这不是特别相关的问题,但C++不允许'char name [4] =“sara”;';如果你指定了尺寸,你必须有足够的空间放置尾部的'\'。 –

回答

19

您正在调整您的数组的大小,使它们对于字符串来说太短(它们不包含空终止符的附加字符)。结果,strcmp在进行比较时正在经过字符串的末尾,产生基本上不可预知的结果。你很幸运没有得到赛格错误。

+11

如果他*得到了seg故障,他会更幸运。 –

+0

那么你能告诉我什么是最好的方式来分配一个字符串或在c中创建一个字符串?请参考 – srisar

+0

srisar:正如其他人所建议的那样,您可以在数组声明中省略显式维值,编译器将根据它们的初始值设定项(例如,char name [] =“sara”)来确定它们的大小。 – Jollymorphic

8

原谅我,如果这是偏离轨道,因为我没有做过年龄C!

main() 
{ 
    char name[] = "sara"; 
    char vname[] = "sara"; 

    if(strcmp(name, vname) == 0) 
    { 
     printf("\nOK"); 
    } 
    else 
    { 
     printf("\nError"); 
    } 
} 

你指定的硬盘长度为你的字符数组,但在C中,字符串空终止,所以“萨拉”实际需要LEN 5,不是4

7

因为namevname不包含字符串。通过为每个字符指定4的大小,并以4个字符的字符串作为初始值设定项,您告诉编译器只存储4个字符而不是'\0'空字符标记字符串的结尾。

行为未定义;你(幸运的),它不只是崩溃。

取出4(或将其更改为5):

char name[] = "sara"; 
char vname[] = "sara"; 

编辑:这里有一个修复等几个问题(见注释)程序的修改版本。其他在namevname的声明中省略4,大多数更改与您的问题没有直接关系。

#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 */ 
} 
1

这是因为你不为你的字符串分配足够的空间(4个字节可以在字符串的结尾存储“萨拉”的角色,而不是空字符。

strcmp走过字符串直到它到达一个nul字符,或者字符串的不同,然后,如果两个字符串的nul都相等,那么既然你没有为nul字符分配足够大的数组,那么你最终会得到你的两个字符串是不相等的,实际上在大多数系统中,你可能会得到的名字是“sarasara”,vname只是“sara”,因为vname在名字后面出现,所以很有可能将它们存储在内存中并覆盖名称nul char。