C语言使用%[^ ]输入多组char数组时后续scanf被跳过如何修复
问题成因
scanf("%[^\n]", str)的匹配规则是读取所有非换行符的字符,匹配到换行符时停止,不会将换行符从输入缓冲区中移除。
第一个输入完成后用户按下的换行符会残留在输入缓冲区,后续执行scanf("%[^\n]", toFind)时,读取到的第一个字符就是换行符,匹配失败直接返回,因此看起来后续的输入语句被直接跳过。
修复方案
以下是几种可用的修复方式:
- 方案1:每次
scanf读取完成后调用getchar()吃掉缓冲区残留的换行符,适合简单学习场景使用printf("Enter a text: "); scanf("%[^\n]", str); getchar(); // 清除残留换行 printf("Enter a search pattern: "); scanf("%[^\n]", toFind); getchar(); printf("Enter a substitute: "); scanf("%[^\n]", replace); getchar(); - 方案2:在
%[^\n]格式符前添加空格,scanf格式串中的空格会自动匹配丢弃所有空白字符(包含换行、空格、制表符),兼容性更强printf("Enter a text: "); scanf(" %[^\n]", str); // 注意%前的空格 printf("Enter a search pattern: "); scanf(" %[^\n]", toFind); printf("Enter a substitute: "); scanf(" %[^\n]", replace); - 方案3:使用更安全的
fgets读取整行输入,同时避免scanf存在的缓冲区溢出风险,注意需要手动清除fgets读取到的末尾换行符printf("Enter a text: "); fgets(str, 100, stdin); // 第二个参数填str数组的实际最大长度 str[strcspn(str, "\n")] = '\0'; printf("Enter a search pattern: "); fgets(toFind, sizeof(toFind), stdin); toFind[strcspn(toFind, "\n")] = '\0'; printf("Enter a substitute: "); fgets(replace, sizeof(replace), stdin); replace[strcspn(replace, "\n")] = '\0';
额外提示:原代码的
scanf未限制读取长度,用户输入超过数组长度的内容时会发生缓冲区溢出,建议修改为%99[^\n]限制最大读取长度,避免内存越界问题。
内容的提问来源于stack exchange,提问作者jonasPamm
相关产品推荐
相关产品推荐

