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]")
和"
字符之间的%
中没有空格时,代码无效。为什么我们要放空间?这个空间是什么意思?
scanf(" %[^\n]", *(arr+i));
格式字符串的" "
部分跳过任何和所有前导空格,包括换行符。
"%[^\n]"
格式字符串的一部分将读取除换行符以外的所有字符,这意味着它将读取到(a)行尾或(b)标准输入流的EOF。在情况(a)中,换行符本身未读入输入流。
没有空格,下一个scanf("%[^\n]", ...)
然后将读取上一个scanf
调用留下的换行符作为第一个字符,并且由于^\n
的排除而将其拒绝,因此它将找不到匹配项"%[^\n]"
格式字符串。
With空格,下一个scanf(" %[^\n]", ...)
将首先读取并丢弃换行符(以及下一行中的任何前导空格),然后按预期读取下一个字符串。
scanf
的返回值。 if(scanf(" %[^\n]",*(arr+i)) != 1) // nothing was matched
{
arr[i][0] = '\0'; // do not leave arr[i] uninitialized
}