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