C:整数打印不正确

时间:2015-02-05 06:46:23

标签: c

<大家好。我试着寻找我遇到的问题,到目前为止似乎无法找到解决方案。我对编程很新,目前正在学习C,但我是一个完整的菜鸟,所以我如果我犯了一个愚蠢的错误,请提前道歉。)

问题在于:我尝试扫描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);
    }

}

4 个答案:

答案 0 :(得分:2)

两件事:

  1. scanf()中给出的输入格式应与输入完全匹配,以便成功进行扫描。 [您需要在输入中添加,]
  2. 始终检查scanf()是否成功,以确保正确扫描价值。 scanf()返回成功匹配和扫描的项目数。
  3. 因此,您应该将代码更改为

     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循环。