我通过简单的练习教授某人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
这是我开始添加*
指针符号的地方,试图看看它会起作用。
答案 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
的第二个参数应该有一个地址,即s1
和s2
。将其更改为:
scanf("%s", s1);
scanf("%s", s2);