为什么只打印输入的第二个值? #包括 #包括 #包括 内部主(空) { char wunit[2];//重量单位 char hunit[2];//高度单位 体重、身高加倍; printf(“输入体重:”); scanf(“%lf%s”,&weight,&wunit);//输入重量和单位,例如150lb printf(“输入高度:”); scanf(“%lf%s”,&height,&hunit);//输入高度和单位,例如5.65英尺 printf(“高度单位:%s\n”,hunit); printf(“重量单位:%s”,wunit); 返回0; }
此代码仅打印高度单位,而不是重量单位。我能做些什么来修复它呢?您在最后一个为什么只打印输入的第二个值? #包括 #包括 #包括 内部主(空) { char wunit[2];//重量单位 char hunit[2];//高度单位 体重、身高加倍; printf(“输入体重:”); scanf(“%lf%s”,&weight,&wunit);//输入重量和单位,例如150lb printf(“输入高度:”); scanf(“%lf%s”,&height,&hunit);//输入高度和单位,例如5.65英尺 printf(“高度单位:%s\n”,hunit); printf(“重量单位:%s”,wunit); 返回0; },c,printf,scanf,C,Printf,Scanf,此代码仅打印高度单位,而不是重量单位。我能做些什么来修复它呢?您在最后一个printf()语句中缺少了一个\n,并且由于stdout可能是缓冲的,它只会写入到行尾的屏幕上。您在最后一个printf()语句中缺少了一个\n,并且由于stdout可能是缓冲的,它只写在行尾的屏幕上。这两个字符串没有多少空间:每个字符串只有2个char。请注意,C字符串还需要空终止字符的空间来标记字符串的结尾 使用null终止字符时,两个字符串只能正确地分别容纳一个字符。当您输入例如“lb”和“ft”时,您使用的数据超
printf()
语句中缺少了一个\n
,并且由于stdout可能是缓冲的,它只会写入到行尾的屏幕上。您在最后一个printf()
语句中缺少了一个\n
,并且由于stdout可能是缓冲的,它只写在行尾的屏幕上。这两个字符串没有多少空间:每个字符串只有2个char
。请注意,C字符串还需要空终止字符的空间来标记字符串的结尾
使用null终止字符时,两个字符串只能正确地分别容纳一个字符。当您输入例如“lb”和“ft”时,您使用的数据超出了数组的界限。将阵列的大小更改为(至少)3,然后查看代码是否正确打印出两个单元:
#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;
}
对于较大的数组,您的代码可以很好地工作。这两个字符串没有太多空间:每个字符串只有2个
char
。请注意,C字符串还需要空终止字符的空间来标记字符串的结尾
使用null终止字符时,两个字符串只能正确地分别容纳一个字符。当您输入例如“lb”和“ft”时,您使用的数据超出了数组的界限。将阵列的大小更改为(至少)3,然后查看代码是否正确打印出两个单元:
#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;
}
您的代码对我来说适用于较大的数组。在
scanf
中使用%s
始终是一个坏主意,原因与获取
始终是一个坏主意相同。必须指定固定的缓冲区大小;您的(2)小得离谱,但更一般地说,您无法控制输入流中的字符数,因此您的程序很容易受到缓冲区溢出的影响
解决此问题的一些方法:
- 前缀
具有一定长度,即“%s
”。这将使复制的字符数达到最大长度%2s
- 使用
将整行数据读入字符串缓冲区(具有任意的最大值),然后对希望使用fgets
读取的值有一些限制。您甚至可以使用%s
来执行此操作sscanf
- 使用类似于
的方法,可以分配任意数量的字符来读取该行readline
- 在
scanf
中使用%s
始终是个坏主意,原因与获取始终是个坏主意相同。必须指定固定的缓冲区大小;您的(2)小得离谱,但更一般地说,您无法控制输入流中的字符数,因此您的程序很容易受到缓冲区溢出的影响
解决此问题的一些方法:
- 前缀
%s
具有一定长度,即“%2s
”。这将使复制的字符数达到最大长度
- 使用
fgets
将整行数据读入字符串缓冲区(具有任意的最大值),然后对希望使用%s
读取的值有一些限制。您甚至可以使用sscanf
来执行此操作
- 使用类似于
readline
的方法,可以分配任意数量的字符来读取该行
因为您试图在2个字符的数组中只包含一个两个字符的字符串。
字符串应始终以“\0”结尾,因此应执行以下操作:
char wunit[3]; // weight unit
char hunit[3]; // height unit
例如,wunit数组将有:[l',b',0],因为您试图在2个字符的数组中只包含一个两个字符的字符串。
字符串应始终以“\0”结尾,因此应执行以下操作:
char wunit[3]; // weight unit
char hunit[3]; // height unit
例如,wunit数组将有:[l',b',0]快速问题。如果您编写C代码,为什么要标记它?C++?<代码> PROTF < /COD>期望用“代码> %s < /COD> >输出的字符串为空终止。将数组长度至少增加到3,并使用scanf(“%2s”,hunit)
告诉scanf
不要读取超过两个字符。@AnthonyBurleigh安全功能是否标准化?我以为它们只是VC++的东西。。。我想学习一些新的东西。“克雷格,我是C++程序员,不是C,很抱歉这个错误!我编辑了我的评论,以使用标准的scanf
,而不是推荐scanf\u s
。非常感谢。为什么不在称重后打印\n
?快速问题。如果您编写C代码,为什么要标记它?C++?<代码> PROTF < /COD>期望用“代码> %s < /COD> >输出的字符串为空终止。将数组长度至少增加到3,并使用scanf(“%2s”,hunit)
告诉scanf
不要读取超过两个字符。@AnthonyBurleigh安全功能是否标准化?我以为它们只是VC++的东西。。。我想学习一些新的东西。“克雷格,我是C++程序员,不是C,很抱歉这个错误!我编辑了我的评论,以使用标准的scanf
,而不是推荐scanf\u s
。非常感谢。你为什么不在重量后打印一个\n
?你的是唯一回答问题的人。。。但是你也应该解决其他的bug。你的bug是唯一一个回答问题的bug。。。但您也应该解决其他bug。