问题在于:我尝试扫描4个整数并使用while循环打印它们的值。问题是,数字被打印为疯狂的长数而不是输入的整数。我尝试扫描并打印一个int并且打印得很好但是一旦我使用了多个int,它就会开始拧紧。
这是我的代码:
#include <stdio.h>
int main()
{
int i, n1,n2,n3,n4;
printf("Enter 4 numbers.");
for(i=0;i<4;i++)
{
printf("\n\nEnter number %d: ", i+1);
scanf("%d,%d,%d,%d", &n1,&n2,&n3,&n4);
printf("%d,%d,%d,%d", n1,n2,n3,n4);
}
}
答案 0 :(得分:2)
两件事:
scanf()
中给出的输入格式应与输入值完全匹配,以便成功进行扫描。 [您需要在输入中添加,
] scanf()
是否成功,以确保正确扫描价值。 scanf()
返回成功匹配和扫描的项目数。 因此,您应该将代码更改为
if ( scanf("%d,%d,%d,%d", &n1,&n2,&n3,&n4) == 4)
{
// use n1, n2, n3, n4
}
else
//don't use them, return some error.
注意:始终初始化局部变量。很多时候它会使你免于 read-before-write 场景的未定义行为。
此外,[可能?] for
循环不是必需的,因为您一次扫描所有四个号码。
答案 1 :(得分:2)
当你有scanf("%d,%d,%d,%d", &n1,&n2,&n3,&n4);
你必须说出你的意见
1,2,3,4
(需要commas
)
你说你想读4个数字,你有scanf
得到4个数字。所以这里不需要循环。如果你想在循环内循环获取one number
。
答案 2 :(得分:0)
你循环4次,期望在每个循环中读取4个数字......
一般来说,scanf()
是一个很差的工具,用于解析可能与预期格式不匹配的任何类型的输入 - 并且没有任何事情像用户输入那样变幻无常。我通常建议读取整行输入(通过fgets()
),然后根据需要在内存中解析它们(在这种情况下,可能意味着使用strtol()
并检查输入的数量string通过其第二个参数解析。)
例如, 更强大:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define LINELEN_MAX 100
int main()
{
int i;
char input[ LINELEN_MAX ];
char * current;
char * end;
while ( 1 )
{
// whitespaces or commas do not matter,
// and neither does the amount of numbers.
puts( "Enter numbers, or 'q' to quit." );
if ( fgets( input, LINELEN_MAX, stdin ) == NULL )
{
puts( "Error on read." );
return EXIT_FAILURE;
}
if ( *input == 'q' )
{
puts( "Quitting." );
return EXIT_SUCCESS;
}
if ( input[ strlen( input ) - 1 ] != '\n' )
{
puts( "Line exceeded maximum width." );
return EXIT_FAILURE;
}
current = input;
end = input;
while ( *current )
{
if ( !isdigit( *current ) )
{
// skip non-digits
++current;
}
else
{
// parse 1..n digits and print
printf( "%ld\n", strtol( current, &end, 10 ) );
current = end;
}
}
}
}
答案 3 :(得分:0)
一个原因可能是您的所有值都打印在同一行上,而它们之间没有任何空格。
基本上,你在一行中连续打印4个数字,这使它看起来像一个大数字。
我建议你添加一个新的行格式说明符。(如果你是新手,那么你可能不明白这一点,所以这里有一些可能有用的链接)
http://www.codingunit.com/printf-format-specifiers-format-conversions-and-formatted-output
还有一个问题是你正在读4个数字4次,就是你总共读了16个变量。对于此代码,您实际上并不需要for循环。