如何终止该C语言代码中的for循环以解决重复输出问题?
C语言子串匹配问题:解决首字符重复输出的问题
问题描述
我希望实现输入一个字符串和一个单词,当单词作为子串出现在字符串中时,仅输出一次字符串的首字符。但当前代码会重复输出首字符,例如输入:
Enter String :bui ngoc minh chau Enter word: ngoc
输出结果是bb,而非预期的单次b。
原代码
#include <stdio.h> #include <string.h> int main() { char str[50], word[50]; int i; char s; printf("\nEnter String :"); fgets(str, 50, stdin); printf("\nEnter character: "); fgets(word, 50, stdin); for (i = 0; i <= strlen(str); i++) { for (int j = 0; j <= strlen(word); j++) { if (str[i] == word[j]) { s = str[0]; printf("%c", s); } break; } } return 0; }
问题根源
原代码的逻辑存在两处核心错误:
- 循环逻辑错误:内层循环仅执行
j=0的判断就立刻break,相当于逐个比较字符串字符与单词的第一个字符,每匹配一次就输出一次首字符,导致重复输出。 - 未处理换行符:
fgets会将输入时的换行符一并读入字符串,可能干扰后续的长度计算与匹配判断。
解决方案
方案1:使用标准库函数strstr(简洁高效)
strstr函数可以直接检查一个字符串是否是另一个的子串,找到匹配后仅输出一次首字符即可:
#include <stdio.h> #include <string.h> int main() { char str[50], word[50]; printf("\nEnter String :"); fgets(str, 50, stdin); // 移除fgets读取的换行符 str[strcspn(str, "\n")] = '\0'; printf("\nEnter word: "); fgets(word, 50, stdin); word[strcspn(word, "\n")] = '\0'; // 检查子串是否存在 if (strstr(str, word) != NULL) { printf("%c\n", str[0]); } else { printf("单词未在字符串中找到。\n"); } return 0; }
方案2:手动实现子串匹配(适合理解底层逻辑)
如果不想依赖标准库函数,可以手动实现子串匹配逻辑,找到匹配后立即终止循环,避免重复输出:
#include <stdio.h> #include <string.h> int main() { char str[50], word[50]; int str_len, word_len; int is_found = 0; printf("\nEnter String :"); fgets(str, 50, stdin); str[strcspn(str, "\n")] = '\0'; str_len = strlen(str); printf("\nEnter word: "); fgets(word, 50, stdin); word[strcspn(word, "\n")] = '\0'; word_len = strlen(word); // 边界判断:单词为空或长度超过字符串 if (word_len == 0 || str_len < word_len) { printf("单词未在字符串中找到。\n"); return 0; } // 遍历字符串,检查每个可能的子串起始位置 for (int i = 0; i <= str_len - word_len; i++) { int match = 1; for (int j = 0; j < word_len; j++) { if (str[i + j] != word[j]) { match = 0; break; } } if (match) { is_found = 1; break; // 找到匹配后立即终止外层循环 } } if (is_found) { printf("%c\n", str[0]); } else { printf("单词未在字符串中找到。\n"); } return 0; }
效果说明
两种方案都能确保:当单词出现在字符串中时,仅输出一次字符串的首字符;未找到时输出提示信息,彻底解决重复输出的问题。
内容的提问来源于stack exchange,提问作者Chow
相关产品推荐
相关产品推荐

