为什么只打印输入的第二个值? #包括 #包括 #包括 内部主(空) { 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。