【问题标题】:String won't allow floating point/ decimal number字符串不允许浮点数/十进制数
【发布时间】:2014-02-26 12:14:29
【问题描述】:

我正在学习 C,并在教程中找到了这段代码,它工作正常,但如果我尝试生成一个十进制数(如 5.5),它会在以下数组中打印一个负数并自行循环。

#include <stdio.h>
#include <locale.h>
#include <stdlib.h>
#include <math.h>
#include "stdafx.h"


#define ARBEITER 3
#define TAGE     5
#define ARBEITSKALENDER kalender();

    int zeitkonto[ARBEITER][TAGE];

    /* Fehlerausgabe */
    void error(int n) {
        printf("%d (?) Falsche Eingabe!!\n", n);
    }

    ABFRAGE0: {
        int i = 0, j = 0;
        for (i = 0; i < TAGE; i++) {
            printf("\n\t[Eingeloggt als: %s ] Tag %d in der Woche\n", vorname, i + 1);
            printf("\t-------------------\n\n");
            for (j = 0; j < ARBEITER; j++) {
                printf("Arbeiter Nr.%d in Std.: ", j + 1);
                scanf("%ld", &zeitkonto[j][i]);
                if (zeitkonto[j][i] > 24) {
                    printf("Ein Tag hat nur 24 Stunden?\n");
                    PCLEAR WHALLOWELT ABSATZ goto ABFRAGE0;
                }
                if (zeitkonto[j][i] > 47) {
                    printf("Wer wünscht sich nicht, man hätte mehr Zeit?");
                    PCLEAR WHALLOWELT ABSATZ goto ABFRAGE0;
                }
            }
        }
    }

我做错了什么?

【问题讨论】:

  • 什么是“点数”?这段代码应该做什么?实际发生了什么?
  • 您能否将代码缩小到您遇到问题的一个功能?
  • 我的意思是像“5.5”之类的数字。它应该读取他们每天工作多长时间并计数到第 5 天。之后其他功能能够说出每天的平均工作时间是多少,哪个工人在哪一天工作了多长时间等等..只是一些测试功能。
  • 尝试编写尽可能小的测试程序来重现此类问题。这里 5 行就足够了。
  • 告诉扫描仪读取整数时,无法读取浮点值。

标签: c arrays loops floating-point numbers


【解决方案1】:

如果您想要zeitkonto 中的浮点数,请替换:

int zeitkonto[ARBEITER][TAGE];

通过

double zeitkonto[ARBEITER][TAGE];

替换

scanf("%ld", &zeitkonto[j][i]);

通过

scanf("%f", &zeitkonto[j][i]);

也可以替换任何

printf("...%ld...", zeitkonto[...][...]) ;

通过

printf("...%f...", zeitkonto[...][...]) ;

【讨论】:

  • 如果我在 zeitkonto 是 int 时输入“5.5”,我的程序会认为输入的值高于 24 ...但到目前为止还不错。毕竟它不会打印那个烦人的错误。如果我把它翻倍,它会再次出现错误。现在呢?
  • 如果您有scanf("%ld", &amp;x),那么x 必须是int 类型。如果您有scanf("%f", &amp;x),那么x 必须是double 类型。
  • 现在已修复.. 非常感谢!现在它就像一个魅力:)
  • 建议scanf("%lf" ...
【解决方案2】:

你有问题的是kalender函数中的scanf

如果您阅读scanf,您将看到该函数返回成功扫描项目的数量。在您的情况下,它将返回 1、0 或 EOF

如果scanf 返回一,则您成功读取了一个整数。如果它返回EOF,则用户按下了文件结尾组合键(或者出现了另一个错误)。您真正需要注意的情况是scanf 返回零的情况,如果您输入了一些意想不到的内容,例如 浮点 值,就会发生这种情况。如果scanf 失败(当它返回零或EOF),它将不会更改变量的值。


问题已被编辑,我发现我关注的是错误的scanf。但是,我的回答(包括有关如何解决问题的提示)仍然有效。


如果您确实希望能够读取浮点数,当然应该将格式更改为"%f""%lf",并且您还必须将数组基类型从 int 更改为 floatdouble

【讨论】:

  • 我的程序告诉我不能这样做,因为ij 需要是整数。
  • @MarcTorvalds 尝试使用"%lf" 格式,使用double zeitkonto[ARBEITER][TAGE];。注意 double 类型。您不应该更改索引变量的类型。
  • link 这是程序给出的截图。它再次循环......虽然我缩短了代码并将其粘贴到自己的 .c 文件中。
【解决方案3】:

zeitkonto 是一个整数数组 - 整数。您需要小数,特别是浮点数。这意味着使用double%lf 来阅读它们。

【讨论】:

  • 我已经试过了——Visual Studio 不太喜欢这个。它说我需要将它们用作整数,否则会出错。它只是说ij 必须是整数。
  • 嗯,这是解决您问题的正确方法,所以问题一定出在您当时的确切代码上。
猜你喜欢
  • 2018-03-08
  • 2020-10-17
  • 2019-04-22
  • 1970-01-01
  • 2021-04-29
  • 1970-01-01
  • 2015-06-27
  • 2014-06-18
相关资源
最近更新 更多