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
相关产品推荐
相关产品推荐

