1
#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

4 回答 4

2

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

使用空终止字符,您的两个字符串每个只能正确包含一个字符。当您输入例如“lb”和“ft”时,您正在使用数组边界之外的数据。将数组的大小更改为(至少)3,并查看代码是否正确打印出两个单位:

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

您的代码适用于更大的数组。

于 2012-09-23T19:16:47.823 回答
1

\n在最后一条printf()语句中缺少 a ,并且由于 stdout 可能已缓冲,因此它仅在行尾写入屏幕。

于 2012-09-23T19:16:39.520 回答
1

使用%sinscanf总是一个坏主意,出于同样的原因,gets它总是一个坏主意。您必须指定一个固定的缓冲区大小;你的 2 小得离谱,但更一般地说,你无法控制输入流中有多少个字符,所以你的程序很容易受到缓冲区溢出的影响。

解决此问题的一些方法:

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

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

  • 使用类似readlinewhich 将分配任意数量的字符来读取该行。

于 2012-09-23T19:19:41.007 回答
1

因为您试图在 2 个字符数组中包含两个字符串。字符串应该总是以 '\0' 结尾,所以你应该这样做:

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

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

于 2012-09-23T19:19:45.400 回答