为什么要在scanf(“%[^ \ n]”)中放置空格?

问题描述 投票:2回答:1
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个回答
2
投票
  scanf(" %[^\n]", *(arr+i));

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

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

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

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


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