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

C语言实现字符串移除指定字符时代码运行无输出问题求助

问题定位

你的代码存在4个核心问题,直接导致无输出/逻辑错误:

  • 循环判断逻辑完全错误:遍历中判断的是目标指针pDest指向的字符,而非源指针pS指向的当前待判断字符。如果字符串首字符就是待删除字符,pDest永远不会移动,遍历结束后你会直接给首位置赋值\0,导致字符串为空。
  • 输出循环的初始值错误:第一个遍历原字符串的循环结束后,i已经等于原字符串的长度,指向原字符串末尾的\0,第二个输出循环的判断条件str[i] != '\0'永远不成立,自然不会有任何输出。
  • 输入待删除字符时会误读换行符:gets读取字符串时会丢弃末尾的换行符,但后续的getchar会直接读取输入缓冲区中残留的换行符作为待删除字符,会导致字符匹配逻辑不符合预期。
  • 使用已被C标准废弃的gets函数:该函数不做边界检查,极易触发缓冲区溢出漏洞,应替换为fgets。

修正后可运行代码

#define MAX_LEN 200
#include <stdio.h>
int main()
{
    char str[MAX_LEN];
    char rem;
    int i = 0;
    
    printf("Enter the sentence:");
    // 替换gets为fgets,避免缓冲区溢出
    fgets(str, MAX_LEN, stdin);
    // 去掉fgets读取到的末尾换行符
    while (str[i] != '\0') {
        if (str[i] == '\n') {
            str[i] = '\0';
            break;
        }
        i++;
    }

    printf("\nEnter the char to remove:");
    rem = getchar();
    // 清空缓冲区残留的多余字符
    while(getchar() != '\n');

    char* pDest = str;
    char* pS = str;
    printf("Original sentence:\n%s\n", str);

    // 修正判断逻辑,判断源指针当前字符
    while (*pS != '\0') {
        if (*pS != rem) {
            *pDest = *pS;
            pDest++;
        }
        pS++;
    }
    *pDest = '\0';

    // 重置i为0再输出
    i = 0;
    while (str[i] != '\0') {
        printf("number%d: %c\n", i, str[i]);
        i++;
    }
    // 直接输出处理后的整串
    printf("Processed sentence:\n%s\n", str);
    return 0;
}

内容的提问来源于stack exchange,提问作者Anchr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 23:36:04