char a[100];
scanf(" %[^n]sn",a);
我知道上面的代码会占用整个数据,你仍然得到''但是方括号和异或符号究竟是如何告诉这一点的,我无法理解它是如何工作的。
有谁确切知道方括号和scanf()
中的异或是什么意思?
[
匹配一组预期字符中的非空字符序列 字符(扫描集)...。方括号(扫描列表)之间的字符构成扫描集,除非左括号后面的字符是回旋符 (^),在这种情况下,扫描集包含扫描列表中回旋符和右括号之间未出现的所有字符。...C11dr §7.21.6.2 12
要使用 scanf()
读取行,请使用以下命令。 请注意,格式中没有"s"
。
char a[100];
// Read up to 99 character that are not n
switch(scanf("%99[^n]", a)) {
// some text was read - the usual path
case 1: break;
// Nothing read, first char was n
case 0: a[0] = 0; break;
// stdin is closed, no more input or input error
case EOF: return;
}
// Now read and discard rest of line which is _usually_ just a n
int ch;
while ((ch = fgetc(stdin)) != 'n' && ch != EOF) {
;
}
使用 scanf()
读取一行并不能实现可靠的 C 代码。
建议使用fgets()
,几乎从不使用scanf()
。
-
[ ]
= 可扫描字符集,表示包括这些大括号在内的字符集只能通过scanf()
扫描。 -
^
= 此符号表示scanf()
可以扫描每个字符,而无需在此符号之后设置这些字符。即
char a[100]; scanf(" %[^n]sn", &a);
意味着我们扫描所有没有换行符的内容。
首先是[ ]
. 这有点像你在正则表达式中看到的角色类。
^
表示不是,所以[^n]
表示不是换行符。
所以[^n]
意味着抓住任何不是换行符的东西。 如果该行由多个换行符组成,那么它会抓取所有内容,直到n
。
无论如何,您在%[^n]
之前有一个空格 - 这似乎没有效果 - 无论如何使用Visual Studio 2013。
我不明白s
在那里做什么? 一个错误?
如果您有:
scanf("%s", a);
并输入字符串:querty keyboard
,则a
将是:querty
。 它可以抓取任何空格。 但在您的格式字符串中没有任何用途。
您也不需要格式字符串中的第 2个n
。