C中的字符串比较给出了分段错误

时间:2016-05-18 01:57:08

标签: c gcc ubuntu-14.04

我通过简单的练习教授某人C编程 我无法使strcmp()功能正常工作。

#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()。但是当在我的程序中使用时,它告诉我不推荐使用上述函数。如何确定可以使用哪些功能以及在哪里查找它们?

修改
节目输出:

prasannarajaram@ubuntu:~/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

这是我开始添加*指针符号的地方,试图看看它会起作用。

3 个答案:

答案 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相同的值。

这应该有效:)

答案 1 :(得分: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将写入由传入的定义的地址,因为您没有设置<{1}}值的初始值,程序的行为未定义。

为了更安全,请考虑使用格式字符串中的s1 define'd值,因此LENGTH的值不会重复:

20

答案 2 :(得分:1)

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

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