我遇到了一个愚蠢的问题,我只能掌握它。 有一个简单的C代码(只想查找字符串str1是否以str2开头):
int main()
{
int i, j;
char sir1[150], sir2[150], sir3[150];
printf("insert the first string (sir1) and then hit ENTER \n");
gets(sir1);
printf("insert the second string (sir1) and then hit ENTER \n");
gets(sir2);
printf("\n");
int len_sir2=strlen(sir2);
for (i=0;i<len_sir2;i++)
{
sir3[i]=sir1[i];
}
for (j=0;j<len_sir2;j++)
{
if (sir3[i]!=sir2[i]){printf("String 1 does not start with String 2\n");break;return 0;}
}
printf("Sir1 starts with Sir2 \n");
getch();
}
我的问题是,例如&#34; bananna&#34;和&#34; ana&#34;,代码似乎对sir2 [0]和sir3 [0]具有相同的值,即使在Quick Watch中显示的值是98&#39; b&#39;和97&#39; a&#39;。我做错了什么? 非常感谢,
答案 0 :(得分:9)
一个错误是你循环j
,但你在循环中使用i
。
for (j=0;j<len_sir2;j++)
{
if (sir3[i]!=sir2[i]){printf("String 1 does not start with String 2\n");break;return 0;}
}
答案 1 :(得分:1)
永远不会达到声明return 0;
。你以前打破了循环。
if (sir3[i]!=sir2[i])
{
printf("String 1 does not start with String 2\n");
break; // <- not needed
return 0;
}
答案 2 :(得分:0)
您应该意识到startsWith()
可以简单地实现:
int startsWith (char *a, char *b) { // a.startsWith(b)
return (strncmp (a, b, strlen (b)) == 0);
}
这比手动迭代每个字符有点“干净”(只是确保你没有在任何“真实”代码中使用gets
,它会打开缓冲区溢出问题):
#include <stdio.h>
#include <string.h>
int startsWith (char *a, char *b) { // a.startsWith(b)
return (strncmp (a, b, strlen (b)) == 0);
}
int main (void) {
char sir1[150], sir2[150];
printf ("insert the first string (sir1) and then hit ENTER \n");
gets (sir1);
printf ("insert the second string (sir1) and then hit ENTER \n");
gets (sir2);
putchar ('\n');
if (startsWith (sir1, sir2))
printf ("sir1 starts with sir2 \n");
else
printf ("Sir1 does not start with sir2 \n");
return 0;
}