变量在c程序中失去了它的价值

时间:2017-07-04 23:08:01

标签: c integer scanf

这是写在' c'并用gcc编译。我不确定你还需要知道什么。

这里展示了我可以放在一起的最小的完整示例。变量' numatoms'当它到达第23行时(在scanf()之后)失去它的值。

我很难过。也许它与scanf()覆盖了numatoms的空间有关?

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

/*
 * 
 */
int main(int argc, char** argv) {
uint8_t numatoms;
uint8_t r;
char a[20];

do {
    printf("NO. OF ATOMS?");
    fflush(stdout);
    scanf("%d", &numatoms);
    printf("\r\n");
    for(;;){
        printf("value of numatoms is %u\r\n", numatoms);
        printf("RAY?");
        fflush(stdout);
        scanf("%u", &r);
        printf("value of numatoms is %u\r\n", numatoms);
        if(r < 1)
            break;
        else {
            printf("value of numatoms is %u\r\n", numatoms);
        }
    }
    printf("CARE TO TRY AGAIN?");
    fflush(stdout);
    scanf("%s", a); 
    printf("\r\n");           
} while (a[0] == 'y' || a[0] == 'Y');

return (EXIT_SUCCESS);

}

2 个答案:

答案 0 :(得分:4)

uint8_t是8位长%u读取无符号整数(可能是32位长)。

您需要将numatoms“更大”(即unsigned int)或阅读正确的尺寸(请参阅scanf can't scan into inttypes (uint8_t)

答案 1 :(得分:2)

您应该为标头<inttypes.h>中定义的整数类型使用宏作为格式说明符。

来自C标准(格式说明符的7.8.1宏)

  

1以下每个类似对象的宏都会扩展为一个字符   包含转换说明符的字符串文字,可能由   一个长度修饰符,适合在a的format参数中使用   转换相应的格式化输入/输出功能   整数类型。这些宏名称具有PRI的一般形式   (fprintf和fwprintf系列的字符串文字)或SCN   (fscanf和fwscanf系列的字符串文字),217)   后跟转换说明符,后跟相应的名称   在7.20.1中使用类似的类型名称。在这些名称中,N代表   7.20.1中所述类型的宽度。

用于转换说明符u的无符号整数类型的宏的一般形式如下所示

SCNuN

这是一个示范程序

#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>

int main(void) 
{
    uint8_t x;

    scanf( "%" SCNu8, &x );

    printf( "x = %u\n", x );

    return 0;
}