scanf获取完整的一行

时间:2016-02-20 11:23:04

标签: c input

char a[100];
scanf(" %[^\n]s\n",a);

我知道上面的代码仍然可以获取整个数据'\ n' 但是方形括号和xor符号究竟是如何告诉我的,我无法理解它是如何工作的。

任何一个谁知道方括号和scanf()中的xor是什么意思?

3 个答案:

答案 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)

  1. [ ] =一组可扫描的字符,表示包含这些括号的字符集只能由scanf()扫描。“
  2. ^ =此符号表示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