为什么只输入第二个值?

时间:2012-09-23 19:13:40

标签: c printf scanf

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

int main(void)
{
    char wunit[2]; // weight unit
    char hunit[2]; // height unit

    double weight, height;

    printf("Enter the body weight: ");
    scanf("%lf%s", &weight, &wunit); // input weight and unit eg. 150lb

    printf("Enter the height: "); 
    scanf("%lf%s", &height, &hunit); // input height and unit eg. 5.65 ft

    printf("The height unit: %s\n", hunit);
    printf("The weight unit: %s", wunit);

    return 0;
}

此代码仅打印出高度单位,而不是重量单位。我该怎么做才能解决它?

4 个答案:

答案 0 :(得分:2)

你不会为这两个字符串留出太多空间:每个字符串只有2 char。请注意,C字符串还需要空格以使用空终止字符来标记字符串的结尾。

使用以null结尾的字符,您的两个字符串只能正确保存单个字符。当你输入例如“lb”和“ft”,您使用的数据超出了数组的范围。将数组的大小更改为(至少)3,并查看代码是否正确打印出两个单元:

char wunit[3]; // weight unit
char hunit[3]; // height unit

使用较大的阵列,您的代码可以正常使用。

答案 1 :(得分:1)

您在上一个\n语句中缺少printf(),并且由于stdout可能是缓冲的,因此它只会在行尾写入屏幕。

答案 2 :(得分:1)

%s中使用scanf总是一个坏主意,因为gets总是一个坏主意。您必须指定固定的缓冲区大小;您的2,非常小,但更一般地说,您无法控制输入流中的字符数,因此您的程序将容易受到缓冲区溢出的影响。

解决此问题的一些方法:

  • 前缀%s有一定长度,即“%2s”。这将在复制的字符数量上设置最大长度。

  • 使用fgets将整行读入字符串缓冲区(具有一些任意最大值),然后您希望使用%s读取的值有一些界限。您甚至可以使用sscanf来执行此操作。

  • 使用类似readline的内容,它会分配任意数量的字符来读取该行。

答案 3 :(得分:1)

因为你试图在2个字符数组中使用两个字符的字符串。 字符串应始终以'\ 0'结尾,因此您应该这样做:

char wunit[3]; // weight unit
char hunit[3]; // height unit

例如,wunit数组将具有:['l','b',0]