2016-05-18 89 views
-2

我教别人C语言编程简单的练习。
我无法获得strcmp()功能工作。在C字符串比较提供分段错误

#include <stdio.h> 
#include <string.h> 
#define MAX 20 
int main() 
{ 
    char s1[MAX], s2[MAX]; 
    printf("Enter s1: "); 
    scanf("%s",s1); 
    printf("Enter s2: "); 
    scanf("%s",s2); 
    printf("S1 is %s\n",s1); 
    printf("S2 is %s\n",s2); 
    // string concatenation 
    strcat(s1,s2); 
    printf("S1 is %s\n",s1); 
    // string copy 
    strcpy(s1,s2); 
    printf("S1 is %s\n",s1); 
    // find the length of the string 
    int a = strlen(s1); 
    printf ("Length of S1 is %d\n", a); 
    int b = strlen(s2); 
    printf ("Length of S2 is %d\n", b); 
    // string comparison    <<----- This is where it does not work 
    int c; 
    c = strcmp(s1, s2); 
    printf("C is %d\n",c); 
    if (c==0) 
    printf("S1 = S2\n"); 
    else if (c<0) 
    printf("S1<S2\n"); 
    else 
    printf("S1>S2\n"); 
    return 0; 
} 

上述代码编译(带有警告)但不执行。它会抛出segmentation fault错误并退出。 我用指针样式语法太多,但它在编译过程使我的错误。

作为一个方面说明,我看到很多人使用gets()puts()网站。但是当在我的程序中使用时,它告诉我使用上述函数已被弃用。如何确定可以使用哪些功能以及在哪里查找它们?

编辑
程序输出:

 
[email protected]:~/Documents/programs/C$ ./string 
Enter s1: test 
Enter s2: case 
S1 is test 
S2 is case 
S1 is testcase 
S1 is case 
Length of S1 is 4 
Length of S2 is 4 
C is 0 
S1 = S2 

这是我开始加入*指针符号来试试,看看会有什么工作。

+2

显示您的输入。 – BLUEPIXY

+0

在显示的示例代码和输入中未唤醒段故障。 – BLUEPIXY

+0

查看我的解释,为什么你的strcmp总是返回0. –

回答

2

刚卸下线指针:

printf("S1 is %s\n",*s1); 
printf("S2 is %s\n",*s2); 

是这样的:

printf("S1 is %s\n",s1); 
printf("S2 is %s\n",s2); 

要知道更多关于C指针,也有很多的教程在互联网上,类似这样的一个:http://karwin.blogspot.com.br/2012/11/c-pointers-explained-really.html

要了解更多关于c和C++函数的信息,可以参考他们的官方文档,在此链接中:http://en.cppreference.com/w/

编辑: 在这条线,你作出的strcat:

strcat(s1,s2) 

所以S1将有S1 + S2的值,但对下一行,你正在做的一个副本s2进入s1。

strcpy(s1,s2) 

之后,s1将具有与s2相同的值,因此s1现在等于s2。这就是为什么你的strcmp总是返回0.你可以看到发生在你的输出。

S1 is test  #S1 initialy 
S2 is case  #S2 initialy 
S1 is testcase #S1 after strcat(s1,s2) 
S1 is case  #S1 after strcpy(s1,s2) 

正如你可以看到S1到底有相同的值S2。

这应该工作:)

2

您使用scanf不正确。我怀疑你的程序的状态正在通话损坏到scanf但它没有被发现,直到你打电话strcmp

当使用scanf读取标准输入到一个字符串,使用以下格式:

#define LENGTH 20 
char str[LENGTH+1] = {0}; 
scanf("%20s", str); // note the "max-length" format parameter of 20. 

通过使用地址的运营商(&)这意味着scanf将写入由值定义的地址传入,因为您没有为s1值设置初始值,所以程序的行为未定义。

更安全,可以考虑使用格式字符串的LENGTH define'd价值,所以不重复的20值:

scanf("%" #LENGTH "s", str) 
+2

'#define LENGTH 20;' - >'#define LENGTH 20','char str [LENGTH];' - >'char str [LENGTH + 1];' ,'scanf(“%”#LENGTH“s”)'不好。 – BLUEPIXY

+0

@BLUEPIXY谢谢 - 我解决了前两个问题(并清除了'str'数组),但是我使用'scanf'出了什么问题? – Dai

+0

尝试编译它。 – BLUEPIXY

1

scanf的第二个参数是应该有一个地址,这是s1s2。将其更改为:

scanf("%s", s1); 
scanf("%s", s2); 
+0

为什么我们应该跳过这个'scanf'中的'&'符号? – Prasanna

+1

@Prasanna对于普通的'int x;','&x'是它的地址。对于数组char'[MAXN];','s'本身就是字符串的起始地址。 – delta