繁体   English   中英

C:整数无法正确打印

[英]C: integers not printing correctly

(大家好。我尝试搜索目前遇到的问题,到目前为止似乎找不到解决方案。我是编程新手,目前正在学习C,但是我是一个完全菜鸟,所以我提前道歉如果我犯了一个愚蠢的错误。)

问题出在这里:Im tryna扫描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);
    }

}

两件事情:

  1. scanf()给出的输入格式应与输入完全匹配,以成功进行扫描 [你需要有,在你输入]
  2. 始终检查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.

注意:始终初始化局部变量。 很多时候,它将使您免于写前读取方案的不确定行为。

另外,[也许?]不需要for循环,因为您一次要扫描所有四个数字。

当您拥有scanf("%d,%d,%d,%d", &n1,&n2,&n3,&n4);

您必须按1,2,3,4的要求输入(需要commas

您说要读取4个数字,并且有一个scanf可以获取4个数字。 因此,这里不需要循环。 如果要循环,则每次在循环内获取one number

您正在循环4次,希望在每个循环中读取4个数字...

一般而言, scanf()对于解析可能与预期格式不匹配的任何类型的输入来说是一个差劲的工具-而且没有什么比用户输入更善变了。 我通常建议读取整个输入行(通过fgets() ),然后根据需要在内存中对其进行解析(在这种情况下,这可能意味着使用strtol()并检查通过解析了多少输入字符串)其第二个参数)。

例如, 更加健壮:

#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;
            }
        }
    }
}

原因之一可能是您的所有值都被打印在同一行上,而它们之间没有任何空格。

基本上,您正在一行中连续打印4个数字,这使其看起来像一个大数字。

我建议您添加一个新的行格式说明符。(如果您是新手,那么您可能不理解这一点,因此这里有一些有用的链接)

http://www.codingunit.com/printf-format-specifiers-format-conversions-and-formatted-output

还有一个问题,您正在读取4个数字4次,即总共要读取16个变量。 对于此代码,您实际上不需要for循环。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM