Windows10+CodeBlocks环境下,scanf用空格配合%[^ ]读字符串的原因
为什么在C语言字符串反转代码中使用
scanf(" %[^\n]", s);读取字符串? 我在Windows 10系统上用CodeBlocks写C语言字符串反转代码时,看到了这样的实现:
#include<stdio.h> #include<string.h> int main() { int t, i, j, temp, len; char s[1002]; scanf("%d", &t); while(t--){ scanf(" %[^\n]", s); len = strlen(s); for(i = 0, j = (len-1); i < (len/2); i++, j--){ temp = s[i]; s[i] = s[j]; s[j] = temp; } printf("%s\n", s); } return 0; }
这段代码是用来实现字符串反转的,想请教一下scanf(" %[^\n]", s);这种写法的原因是什么?
这个写法的核心是完整读取带空格的整行输入,拆解开来分两部分理解:
开头的空格
:
你之前用scanf("%d", &t);输入测试用例数t后,按下回车的换行符\n会留在输入缓冲区里。如果直接写scanf("%[^\n]", s);,这个格式符会立刻碰到缓冲区里的换行符,导致读取到空字符串,第一次循环直接失效。开头加空格的作用是告诉scanf跳过所有空白字符(包括换行、空格、制表符),直到遇到第一个非空白字符才开始读取,完美解决了之前输入残留的换行问题。%[^\n]扫描集格式符:
普通的scanf("%s", s)会在遇到空格、换行等空白字符时停止读取,只能拿到单个单词——比如输入"hello world",它只能读到"hello",后面的"world"会留在缓冲区里,反转结果自然不对。而%[^\n]的意思是“读取所有不是换行符的字符,直到碰到换行符为止”,这样就能完整读取一整行内容,包括中间的空格,刚好满足字符串反转需要处理任意带空格文本的需求。
额外提醒:
使用%[^\n]时一定要确保数组s的大小足够,避免缓冲区溢出。比如代码里定义了char s[1002];,最好把格式串改成scanf(" %1001[^\n]", s);(1001是因为字符串末尾需要留一个位置放终止符\0),这样即使输入超过1001个字符,也只会读取前1001个,避免越界风险。
内容的提问来源于stack exchange,提问作者Zareef Bin Zaman
相关产品推荐
相关产品推荐

