You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 16:33:11