【问题标题】:Why we should put space in scanf("% [^\n]")?为什么我们应该在 scanf("% [^\n]") 中放置空格?
【发布时间】:2020-09-15 07:00:51
【问题描述】:
size_t n;
scanf("%d", &n);

char** arr;
arr = (char**)malloc(n * sizeof(char*));

for (size_t i = 0; i < n; ++i)
{
    *(arr + i) = (char*)malloc(10000 * sizeof(char));
    scanf(" %[^\n]",*(arr+i));
    *(arr + i) = (char*)realloc(*(arr + i), strlen(*(arr + i)) + 1);
    puts(arr[i]);
}

scanf("% [^\n]")"% 之间没有空格时,字符代码不起作用。为什么我们要放置空间?这个空格字符是什么意思?

【问题讨论】:

    标签: c scanf whitespace format-specifiers


    【解决方案1】:
      scanf(" %[^\n]", *(arr+i));
    

    格式字符串的" " 部分会跳过所有前导空格,包括换行符。

    格式字符串的"%[^\n]" 部分读取除换行符以外的所有字符,这意味着它读取到 (a) 行尾或 (b) 标准输入流的 EOF。如果 (a) 换行符本身未被读取到输入流中。

    如果没有空格,下一个scanf("%[^\n]", ...) 将读取上一个scanf 调用留下的换行符作为第一个字符,并且会因为^\n 排除而拒绝它,因此它无法找到匹配"%[^\n]" 格式字符串。

    使用空格,下一个scanf(" %[^\n]", ...) 将首先读取并丢弃换行符(以及下一行的任何前导空格),然后按预期读取下一个字符串。


    [ EDIT ] 在相关说明中,始终建议检查 scanf 的返回值。
        if(scanf(" %[^\n]",*(arr+i)) != 1)  // nothing was matched
        {
            arr[i][0] = '\0';  // do not leave arr[i] uninitialized
        }
    

    【讨论】:

    • 非常感谢。
    猜你喜欢
    • 2013-09-14
    • 1970-01-01
    • 1970-01-01
    • 2021-10-26
    • 1970-01-01
    • 2023-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多