scanf与UI输入处理问题:无法读取字符串及循环异常
解决scanf读取字符串时被换行符干扰的问题
问题核心是输入缓冲区残留的换行符在搞鬼:每次用scanf("%u", &length)读完无符号整数后,你按的回车(\n)会留在缓冲区里,后续的getchar()或scanf会直接把这个换行当有效输入,导致字符串读不到、逻辑乱套。
给你两种靠谱的解决思路,附带修正后的代码:
思路1:用格式串的空格跳过空白字符
scanf的格式串里,空格会自动跳过所有空白字符(包括换行、空格、制表符),利用这个特性可以直接规避残留换行的问题:
int main(){ // (...) 假设已经定义了t、length、color、string、resultados等变量 scanf("%u", &t); for (int i = 0; i < t; i++){ // %u后面加空格,跳过length输入后的换行/空白;%c前面加空格,同样跳过color输入后的空白 scanf("%u %c", &length, &color); // 读取字符串前加空格,跳过所有残留空白,%[^\n]读取直到换行的所有字符(包括空格) scanf(" %[^\n]", string); resultados[i] = trafficLight(string, length, color); } // (...) }
思路2:手动清空输入缓冲区
每次读完需要输入的内容后,手动把缓冲区里的残留字符(直到换行)全部吃掉:
int main(){ // (...) scanf("%u", &t); for (int i = 0; i < t; i++){ scanf("%u", &length); // 吃掉length输入后残留的所有字符,直到换行 while(getchar() != '\n'); color = getchar(); // 吃掉color输入后残留的换行 while(getchar() != '\n'); // 读取字符串,此时缓冲区干净了 scanf("%[^\n]", string); resultados[i] = trafficLight(string, length, color); } // (...) }
顺便说下你之前方法无效的原因:
- 方法1:
scanf("%u %c", &length,&color);本身没问题,但scanf("%s", string);只能读到第一个空格,如果你输入的字符串带空格就会读不全;循环停不下来大概率是缓冲区残留导致后续读取错误,把t的值搞乱了。 - 方法2:
scanf(" %s", string);的问题是%s不支持带空格的字符串,而且你没配合前面的输入处理,还是会读到残留换行。 - 方法3:
scanf("%[^\n]s", string);里的s是多余的!%[^\n]是完整的格式符,加s会让scanf一直等你输入s字符,永远读不完,这是格式符用错了。 - 方法4:单独用
color = getchar();时,它读到的是scanf("%u")留下的换行符,根本不是你输入的颜色字符,自然没用。
内容的提问来源于stack exchange,提问作者dumping the core
相关产品推荐
相关产品推荐

