#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;
}
此代码仅打印出高度单位,而不是重量单位。我该怎么做才能解决它?
答案 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]