代码之家  ›  专栏  ›  技术社区  ›  xOneca

scanf()根据变量声明顺序重置第一个结果

  •  3
  • xOneca  · 技术社区  · 15 年前

    为什么这不能像预期的那样起作用?

    int main()
    {
        unsigned char louise, peter;
    
        printf("Age of Louise: ");
        scanf("%u", &louise);
    
        printf("Age of Peter: ");
        scanf("%u", &peter);
    
        printf("Louise: %u\n", louise);
        printf("Peter: %u\n", peter);
    
        return 0;
    }
    

    Age of Louise: 12
    Age of Peter: 13
    Louise: 0
    Peter: 13
    

    但是,如果我交换变量声明,它会起作用:

    unsigned char peter, louise;
    

    Age of Louise: 12
    Age of Peter: 13
    Louise: 12
    Peter: 13
    

    我还注意到使用 int unsigned int 无需交换变量即可工作,但 char 不。

    我试过把 printf("%u", louise); 就在那之后 scanf() scanf()

    2 回复  |  直到 15 年前
        1
  •  1
  •   t0mm13b    15 年前

    这就是你的错误,你的变量是 unsigned char 这是1字节,但是,您输入了12,这是4字节(一个无符号整数),这导致了溢出(由编译器/运行时定义的实现),这将解释它覆盖内存中的下一个变量。你用了 %u 说明符 printf unsigned int 无符号字符 变量,该变量不正确且不匹配。这就解释了,正如你自己发现的,使用 无符号整型 int 工作,因为有足够的空间容纳输入值。

    希望这有帮助, 汤姆。

        2
  •  4
  •   unwind    15 年前

    因为 %u 读取并存储 unsigned int ,它很可能比单个 unsigned char

    无法读取整数字符串(如“42”)并将其存储在 char int

    int tmp;
    char my_char;
    
    if(scanf("Enter a number: %d", &tmp) == 1)
    {
      my_char = (unsigned char) tmp;
    }