You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何终止该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;
}

问题根源

原代码的逻辑存在两处核心错误:

  1. 循环逻辑错误:内层循环仅执行j=0的判断就立刻break,相当于逐个比较字符串字符与单词的第一个字符,每匹配一次就输出一次首字符,导致重复输出。
  2. 未处理换行符: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 00:23:21