gpt4 book ai didi

c - 为什么%c前面需要加空格?

转载 作者:行者123 更新时间:2023-11-30 16:58:47 30 4
gpt4 key购买 nike

下面的代码在我编译后立即给出了奇怪的o/p。

main() {
char name[3];
float price[3];
int pages[3], i;

printf ( "\nEnter names, prices and no. of pages of 3 books\n" ) ;

for ( i = 0 ; i <= 2 ; i++ )
scanf ("%c %f %d", &name[i], &price[i], &pages[i] );

printf ( "\nAnd this is what you entered\n" ) ;

for ( i = 0 ; i <= 2 ; i++ )
printf ( "%c %f %d\n", name[i], price[i], pages[i] );
}

但是如果我们在 scanf 语句中的 %c 之前给出空格,它就会给出正确的 o/p。

谁能解释一下为什么会这样?

更新:-

如果我提供这样的输入-

F
123.45
56
J
134
67
K
145
98

那么我的问题是为什么我们不在 %f 之前和 %d 之前给出空格?为什么我们只需要在 %c 之前留出空格?

最佳答案

在格式字符串中添加空格可启用 scanf消耗每次按 return 时发生的输入中的换行符。没有空格,name[i]将收到字符 '\n' ,并且 real 字符被 %f 误解。 .

所以,假设您的输入是

a 1.0 2
b 3.0 4
c 5.0 6

程序看起来更像是这样:

a 1.0 2\nb 3.0 4\nc 5.0 6\n\377

也就是说,换行符是文件中的实际字符(这里的\377 表示“文件结尾”)。

第一个scanf看起来工作正常,消耗一个字符、一个 float 和一个整数。但它留下的输入是这样的:

\nb 3.0 4\nc 5.0 6\n\377

所以第二个scanf将阅读'\n'作为它的%c,除非你先删除它。

在格式字符串中添加空格会指示 scanf 丢弃任何空白字符(任何空格 ' ' 、制表符 '\t' 或换行符 '\n' )。

A directive is one of the following:

  • A sequence of white-space characters (space, tab, newline, etc.; see isspace(3)). This directive matches any amount of white space, including none, in the input.

  • ...

from http://linux.die.net/man/3/scanf

<小时/>

每当您使用 scanf 时就会出现此类问题与 %c循环中。因为,假设自由格式输入,换行符可能出现在任何地方。因此,通常尝试使用两层方法来避免整个问题。您将输入的读入缓冲区(使用 fgets );砍掉愚蠢的换行符;然后使用sscanf而不是scanf从缓冲区(字符串)读取而不是直接从文件读取。

关于c - 为什么%c前面需要加空格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38562786/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com