C语言字符串删字符程序中scanf读取时机异常问题求助
问题分析与解决:scanf读取字符位置导致的输入缓冲区问题
问题根源:输入缓冲区的换行残留
当你用scanf("%s", texto)读取字符串时,输入完字符串后按下的**换行符\n**会留在输入缓冲区中。之后调用scanf("%c", &del)时,它不会等待你输入新字符,而是直接读取了这个残留的换行符,导致程序误以为你要删除的是换行符,自然无法正常工作。而把scanf("%c", &del)放在读字符串之前时,此时缓冲区是空的,所以会正常等待你输入字符。
快速解决方案
有几种简单方法可以解决这个问题:
- 在读取
del之前,用getchar()吃掉残留的换行符:scanf("%s", texto); getchar(); // 清除缓冲区里的换行符 scanf("%c", &del); - 或者在
scanf的格式串前加一个空格,让它自动跳过所有空白字符(包括换行、空格、制表符):scanf("%s", texto); scanf(" %c", &del); // 注意%c前面的空格
顺便修正你代码里的其他问题
你的代码还有几个明显的错误,会导致程序运行异常:
- 注释里的循环代码有笔误:
texto[j]=texto=i;应该是texto[j]=texto[i];,j=+1;应该是j+=1; - 字符串结束符应该用
'\0'而不是NULL(NULL是指针类型的空值,字符串结束符是字符'\0') - 递归函数的返回部分没写完,而且递归逻辑可以优化,比如不需要把
i和j作为参数传递(可以用静态变量或者指针参数来跟踪索引)
这里给你修正后的完整递归版本代码:
#include <stdio.h> #include <stdlib.h> #include <string.h> char* deleteChar(char* texto, int n, char del) { static int i = 0, j = 0; // 用静态变量跟踪索引,避免作为参数传递 if (i != n) { if (texto[i] != del) { texto[j] = texto[i]; j++; } i++; deleteChar(texto, n, del); } else { // 在新的末尾添加字符串结束符 texto[j] = '\0'; // 重置静态变量,避免下次调用时状态残留 i = 0; j = 0; } return texto; } int main() { char texto[100]; char del; printf("请输入字符串:"); scanf("%s", texto); printf("请输入要删除的字符:"); scanf(" %c", &del); // 用空格跳过空白字符 int len = strlen(texto); deleteChar(texto, len, del); printf("删除后的字符串:%s\n", texto); return 0; }
如果你不想用静态变量(避免多次调用时的状态残留),也可以把i和j作为指针参数传递:
char* deleteChar(char* texto, int n, char del, int* i, int* j) { if (*i != n) { if (texto[*i] != del) { texto[*j] = texto[*i]; (*j)++; } (*i)++; deleteChar(texto, n, del, i, j); } else { texto[*j] = '\0'; } return texto; } // 在main里调用: int i = 0, j = 0; deleteChar(texto, len, del, &i, &j);
这样程序就能正常工作啦!
内容的提问来源于stack exchange,提问作者Matheus Dias
相关产品推荐
相关产品推荐

