未知错误函数 'scanf("%[^\n]%*c", &sent);'
unknown error the function 'scanf("%[^\n]%*c", &sent);'
言归正传,我是C语言的初学者,刚刚在C程序中遇到了输入字符串的奇葩方法:
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
int main() {
char ch, string[100], sent[100];
scanf("%c", &ch);
scanf("%s", &string);
scanf("%[^\n]%*c", &sent);
printf("%c\n", ch);
printf("%s\n", string);
printf("%s", sent);
return 0;
}
这是错误:最后一行 (Sentence) 没有打印出来,不知道我哪里错了,但在研究中我发现了这段代码:
scanf(" %[^\n]%*c", &sent); //not theres a space before %[^\n]%*c; and then it worked (wtf)
你能解释一下为什么只添加一个 space 就可以吗?
格式字符串中的space(</code>)导致scanf跳过输入中的whitespace。它通常不需要,因为大多数 scanf 转换在扫描任何东西之前也会跳过 whitespace,但是不需要的两个是 <code>%c
和 %[
——所以使用 space在 %[
之前有一个可见的效果。让我们看看您的 3 个 scanf 调用做了什么:
scanf("%c",&ch); // read the next character into 'ch'
scanf("%s",&string); // skip whitespace, then read non-whitespac characters
// into 'string', stopping when the first whitespace after
// some non-whitespace is reached (that last whitespace
// will NOT be read, being left as the next character
// of the input.)
scanf("%[^\n]%*c",&sent); // read non-newline characters into 'sent', up until a
// newline, then read and discard 1 character
// (that newline)
所以第 3 次 scanf 将从结束第二次 scanf 的白色space开始读取。如果您将 space 添加到格式的开头,它将改为读取并丢弃白色 space 直到找到非白色 space 字符,然后开始读取 sent
与那个非白色 space 字符。
同样有趣的是,如果结束第二个 scanf 的白色space 恰好是换行符,会发生什么情况。在这种情况下,第三次 scanf 将完全失败(因为在换行符之前没有要读取的非换行符)并且什么都不做。将此处的 space 添加到第三个 scanf 可确保它不会因换行而结束(它将被丢弃为白色 space),因此它将始终将某些内容读入 sent
,除非到达 EOF。
言归正传,我是C语言的初学者,刚刚在C程序中遇到了输入字符串的奇葩方法:
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
int main() {
char ch, string[100], sent[100];
scanf("%c", &ch);
scanf("%s", &string);
scanf("%[^\n]%*c", &sent);
printf("%c\n", ch);
printf("%s\n", string);
printf("%s", sent);
return 0;
}
这是错误:最后一行 (Sentence) 没有打印出来,不知道我哪里错了,但在研究中我发现了这段代码:
scanf(" %[^\n]%*c", &sent); //not theres a space before %[^\n]%*c; and then it worked (wtf)
你能解释一下为什么只添加一个 space 就可以吗?
格式字符串中的space(</code>)导致scanf跳过输入中的whitespace。它通常不需要,因为大多数 scanf 转换在扫描任何东西之前也会跳过 whitespace,但是不需要的两个是 <code>%c
和 %[
——所以使用 space在 %[
之前有一个可见的效果。让我们看看您的 3 个 scanf 调用做了什么:
scanf("%c",&ch); // read the next character into 'ch'
scanf("%s",&string); // skip whitespace, then read non-whitespac characters
// into 'string', stopping when the first whitespace after
// some non-whitespace is reached (that last whitespace
// will NOT be read, being left as the next character
// of the input.)
scanf("%[^\n]%*c",&sent); // read non-newline characters into 'sent', up until a
// newline, then read and discard 1 character
// (that newline)
所以第 3 次 scanf 将从结束第二次 scanf 的白色space开始读取。如果您将 space 添加到格式的开头,它将改为读取并丢弃白色 space 直到找到非白色 space 字符,然后开始读取 sent
与那个非白色 space 字符。
同样有趣的是,如果结束第二个 scanf 的白色space 恰好是换行符,会发生什么情况。在这种情况下,第三次 scanf 将完全失败(因为在换行符之前没有要读取的非换行符)并且什么都不做。将此处的 space 添加到第三个 scanf 可确保它不会因换行而结束(它将被丢弃为白色 space),因此它将始终将某些内容读入 sent
,除非到达 EOF。