scanf(“%[^ \ n] s”,a)设置大小为字符串

时间:2017-02-16 03:53:07

标签: c

所以我使用了一个代码 的scanf( “%[^ \ n]的的”,一个); 并且有多个scanf来接受不同的输入,有些是字符串输入。所以我理解scanf(“%[^ \ n] s”,a)接受输入直到达到新行,但是我想知道我的字符串最多只能容纳10个字符,然后我的字符串被填满之后,但是还没有达到新线路如何在进入新线路之前摆脱额外的输入。我想做getchar()直到达到新行,但为了检查我的10个点是否已经填充我需要使用getchar,所以这不会弄乱我的下一个scanf输入吗?有没有其他方法可以做到这一点?还在使用scanf()和getchar?

2 个答案:

答案 0 :(得分:3)

scanf("%[^\n]s",a)是一个常见的错误; %[指令与%s指令不同。你从scanf得到的是:

  • 一组非'\n'字符,后跟......
  • 文字s字符。

也许您打算写scanf("%[^\n]",a)?请注意已删除的s ...

您可以使用*修饰符来取消指令的分配,例如scanf("%10[^\n]", a);,然后scanf("%*[^\n]");读取并放弃到下一个换行符,getchar();到阅读并丢弃该换行符:

scanf("%10[^\n]", a);
scanf("%*[^\n]");     // read and discard up to the next newline
getchar();            // read and discard that newline

正如所指出的,可以连接两个格式字符串以减少对scanf的调用次数。为了记录起见,我以这种方式写了我的答案,我将保留原样。此外,我认为优化的尝试可以忽略不计;在实际情况下,分析器可能表明更加显着的优化瓶颈。

答案 1 :(得分:1)

您可以使用此格式保存前10个字符并保留输入的下一行

scanf("%10[^\n]%*[^\n]",a);
getchar();