【问题标题】:Why is only the second value entered printed?为什么只打印输入的第二个值?
【发布时间】:2012-09-23 19:13:39
【问题描述】:
#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;
}

此代码仅打印出身高单位,而不是体重单位。我能做些什么来解决它?

【问题讨论】:

  • 快速提问。如果您正在编写 C 代码,为什么要标记为 C++?
  • printf 期望带有%s 的字符串输出以空值结尾。将数组的长度增加到至少 3,并使用scanf("%2s", hunit) 告诉scanf 不要读取超过两个字符。
  • @AnthonyBurleigh 安全功能是否标准化?我以为它们只是 VC++ 的东西……我猜想学习一些新东西。
  • @Craig 我是一名 C++ 程序员,而不是 C,抱歉这个错误!我已编辑我的评论以使用标准 scanf 而不是推荐 scanf_s。谢谢!
  • 为什么不在重量后打印\n

标签: c printf scanf


【解决方案1】:

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

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

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

你的代码对我来说适用于更大的数组。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 你的是唯一一个回答了这个问题的人......但你也应该解决其他错误。
    【解决方案3】:

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

    解决此问题的一些方法:

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

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

    • 使用readline 之类的东西,它将分配任意数量的字符来读取该行。

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-18
        • 2016-12-04
        • 2016-07-01
        • 1970-01-01
        • 2010-12-22
        相关资源
        最近更新 更多