C - 用于获得完整生产线的 SCANF


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()

  1. [ ] = 可扫描字符集,表示包括这些大括号在内的字符集只能通过scanf()扫描。
  2. ^ = 此符号表示scanf()可以扫描每个字符,而无需在此符号之后设置这些字符。

    char a[100]; scanf(" %[^n]sn", &a);意味着我们扫描所有没有换行符的内容。

首先是[ ] . 这有点像你在正则表达式中看到的角色类。

^ 表示不是,所以[^n]表示不是换行符。

所以[^n]意味着抓住任何不是换行符的东西。 如果该行由多个换行符组成,那么它会抓取所有内容,直到n

无论如何,您在%[^n]之前有一个空格 - 这似乎没有效果 - 无论如何使用Visual Studio 2013。

我不明白s在那里做什么? 一个错误?

如果您有:

scanf("%s", a);

并输入字符串:querty keyboard,则a将是:querty 。 它可以抓取任何空格。 但在您的格式字符串中没有任何用途。

您也不需要格式字符串中的第 2n

相关内容

  • 没有找到相关文章

最新更新