我正在尝试编写一个程序来查看字符串1是否是字符串2的一部分。在命令提示符下,我输入字符串1,然后输入字符串2.但问题是,无论我键入什么,我的程序不断打印出“不,字符串1不是字符串2的一部分”的答案。我不确定我做错了什么,我的for循环有什么问题吗?感谢帮助!
int string_part_of_other(void)
{
char str1[20];
char str2[20];
int answer = 1;
printf("Enter string 1:\n");
scanf("%s", str1);
printf("Enter string 2:\n");
scanf("%s", str2);
for (int i = 0; str1[i] != '\0'; i++)
{
for (int j = 0; str2[j] != '\0'; j++)
{
if (str1[i] != str2[j])
{
answer = 0;
}
}
}
return answer;
}
int main()
{
int result;
result = string_part_of_other();
if (result == 1)
{
printf("Yes, string 1 is part of string 2.\n");
}
if (result == 0)
{
printf("No, string 1 is not part of string 2.\n");
}
return 0;
}
答案 0 :(得分:1)
问题出在你的循环中。您将整个字符串与一个字符进行比较。
for (int i = 0; str1[i] != '\0'; i++){
for (int j = 0; str2[j] != '\0'; j++){ // here
if (str1[i] != str2[j]) answer = 0;
}
}
strpbrk
或strstr
是一个自动执行此操作的函数,如果这是您想要的。
你也可以试试这个:
for (int i = 0; str1[i]; i++){
int j = 0;
for (; str2[j] && str1[i + j]; j++){
if (str2[j] != str1[i + j]) break;
}
if (!str2[j]) return 1; /*
* This means the loop broke because it reached the end of the
* string, not because of a mismatch. Therefore, str2 is within str1
*/
}
return 0;
另外,我认为你打算说string 2 is part of string 1
,而不是相反。
答案 1 :(得分:1)
您编写的算法回答如下:
“对于string1中的每个字符,它是否与string2中的每个字符匹配?”
如果你单步执行头脑中的代码,你应该能够弄清楚出了什么问题,以及如何解决它。
答案 2 :(得分:1)
几点评论:
请勿使用scanf()
。它没有按照你的想法做到,它甚至在没有指定字段宽度的情况下也不受保护,所以你应该期待缓冲区溢出。
所以请改用fgets(buf, sizeof(buf), stdin)
(并注意尾随换行符)。
不要重新发明轮子:在C标准库中有一个名为strstr()
的函数,它可以完全按照您的需要运行,并且它可以正常工作,而不像您当前的丑陋黑客 - 不可读 - 嵌套-for - 环
总而言之:
int part_of()
{
char buf1[LINE_MAX], buf2[LINE_MAX], *p;
fgets(buf1, sizeof(buf1), stdin);
fgets(buf2, sizeof(buf2), stdin);
p = strchr(buf1, '\n');
if (p) *p = 0;
p = strchr(buf2, '\n');
if (p) *p = 0;
return strstr(buf1, buf2) != NULL;
}
此外,之后不要立即写if (func() == 1) {}
然后if (func() == 0) {}
- 冗余很糟糕。 if (func()) {} else {}
没问题。
答案 3 :(得分:1)
例如,如果str1
中的最后一个字符与str2
中的最后一个字符彼此不匹配,则answer
将为0
。即使str2
是str1
答案 4 :(得分:1)
你只是将str1的所有字符与str2的字符进行比较,即使存在一个不匹配,你也可以将答案设置为零..基于问题的错误逻辑 我假设您要检查str1是str2的一部分,外部循环应该是父级或包含字符串,在这种情况下str2 ...
int answer=0;
for(int i=0;str2[i]!='\0';i++) //traversing bigger string
{
if(str2[i]==str1[0])
//if character of bigger string matches first character small string
{
for(int j=0;str1[j]!='\0';j++)
{
if(((i+j)<strlen(str2))&&(str1[j]!=str2[i+j])){
break;}
}//j
if(str1[j-1]=='\0')
{answer=1;
break;}
}//i
答案 5 :(得分:0)
if (str1[i] != str2[j]) {
answer = 0;
}
如果你的string1中的第一个文字与string2不匹配,则answer设置为0,之后即使找到子字符串,你也不会将答案改为1,所以你没有得到正确的结果。
另外,你只是递增str2索引而不是用它递增str1索引,所以你永远不会找到字符串,所以改变逻辑。
答案 6 :(得分:0)
我重写了一些代码:
#include <stdio.h>
int string_part_of_other(void)
{
char str1[20];
char str2[20];
int answer = 0;
int i, j, k;
printf("Enter string 1:\n");
scanf("%s", str1);
printf("Enter string 2:\n");
scanf("%s", str2);
i = j = k =0;
while(str2[j] !='\0')
{
k = j;
for(i = 0; str1[i] != '\0' && str2[k] != '\0'; i++, k++)
{
if(str1[i] != str2[k])
{
break;
}
}
if(str1[i] == '\0')
{
answer = 1;
}
j++;
}
return answer;
}
int main()
{
int result;
result = string_part_of_other();
if (result == 1)
{
printf("Yes, string 1 is part of string 2.\n");
}
if (result == 0)
{
printf("No, string 1 is not part of string 2.\n");
}
return 0;
}