char a[100];
scanf(" %[^\n]s\n",a);
我知道上面的代码仍然可以获取整个数据'\ n' 但是方形括号和xor符号究竟是如何告诉我的,我无法理解它是如何工作的。
任何一个谁知道方括号和scanf()
中的xor是什么意思?
答案 0 :(得分:1)
[
匹配一组预期的非空字符序列 字符(扫描集).........括号(扫描列表)之间的字符组成扫描集,除非左括号后面的字符是抑扬符(^),在这种情况下,扫描集包含所有未出现在扫描列表中的字符。旋转和右支架。 ......C11dr§7.21.6.212
要使用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()
。
答案 1 :(得分:0)
[ ]
=一组可扫描的字符,表示包含这些括号的字符集只能由scanf()
扫描。“ ^
=此符号表示scanf()
可能会扫描每个字符,而不会在此符号后设置这些字符。
即。 char a[100];
scanf(" %[^\n]s\n", &a);
表示我们扫描没有换行符的所有内容。
答案 2 :(得分:0)
首先是[ ]
。这有点像你在正则表达式中看到的字符类。
^
表示不是,因此[^\n]
表示不换行。
所以[^\n]
意味着抓住任何不是新行的东西。如果该行不仅包含换行符,那么它会抓取所有内容到\n
。
在%[^\n]
之前有一个空格 - 似乎没有任何效果 - 无论如何都使用Visual Studio 2013。
我不明白s
在那里做什么?一个失误?
如果你有:
scanf("%s", a);
并输入字符串:querty keyboard
,然后a
将是:querty
。它可以抓住任何空白区域。但是你的格式字符串没有用处。
格式字符串中也不需要2 nd \n
。