小编Zei*_*kon的帖子

将 float 转换为 int 会更改值

我看过这个问题,似乎情况不一样。

我正在编写的检查注册程序中有一个函数,它从用户那里读取美元金额,验证它没有输入小数美分,并与用户核对输入是否正确。但是,我得到的是,在将输入的浮点值乘以 100 并用 截断后(int),值会发生变化。例如,如果我输入 1118.58,我可以(通过调试printf语句)验证 1118.58 是否被amt正确扫描并分配给,并且我的while条件(int)100 * amt == 100 * amt正确测试为TRUE,但转换为整数后,整数值存储为 111857。更令人困惑的是,并不是每个值都会发生这种情况(尽管我刚刚在测试中进展顺利,这是我看到的第一个以这种方式改变的条目)。

我在 Kubuntu 14.04 64 位上使用 gcc,在我的编译命令中使用 C99 标准设置。这是出现问题的函数(假设您不想/不需要查看完整程序的 1300 行)。注意:为了方便起见,我在头文件中定义了布尔值和运算符——我最近发现有一种标准方法可以做到这一点,但还没有转换我的头文件。

int get_amt (void)
{
  float amt;
  int scanned, i_amt;
  int success = FALSE;
  char yn = '\0';

  while (NOT success)
  {
    scanned = scanf("%f%*c", &amt);

    /* validate and verify amount */
    if (scanned >= 1 AND (int)100*amt == 100*amt AND amt …
Run Code Online (Sandbox Code Playgroud)

c types casting

1
推荐指数
1
解决办法
137
查看次数

如何使多维数组不易引起精神错乱?

我正在通过88 C程序工作,在将近二十五年之后重新学习C(由于自1990年以来至少对该语言本身进行了两次主要版本修订这一事实很复杂,我确信Turbo-C我当时用的并不完全兼容C89).我不记得我所用的类对二维数组做了什么后果,并将它们传递给函数,期望我需要在不知道编译时的维数的情况下处理数据,这很好.我的头爆炸了.

我正在使用gcc(目前在Ubuntu 14.04的标准存储库中找到的版本),我收集它应该支持C99或C2011标准下的可变长度数组声明,但是我试图用来制作函数的声明识别数组而不必知道编译时的大小是否有关于"冲突类型"的错误.我正在编写警告设置为max,使用一个小的Python程序来节省每次我需要编译时输入一个长命令行(结果命令是gcc -std=c99 -pedantic -Wall -Wextra -o target target.c -lm).以下是原型,来电线和功能定义(代码中充满了警告,导致不良做法,我从书中复制了它;我现在不关心那些,我对学习感兴趣这样做的理智方式,所以我不必使用那些丑陋,令人困惑的方法).

#include <stdio.h>
#include <stdlib.h>

/* ANSI prototypes */

void s2 (int, int, int*);
int main (void);

int main (void)
{
  int one[5]={0,1,2,3,4};
  int two[3][4] =
  {
{0,1,2,3},
{10,11,12,13},
{100,101,102,103}
  };

  /* try to call s2, it won't work */
  printf("\ncalling s2 \n");
  s2(1, 5, one);
  s2(3, 4, two); /* will be compiler warning */
}

void s2(int rows, int cols, int *x[rows][cols]) …
Run Code Online (Sandbox Code Playgroud)

c arrays c99

0
推荐指数
1
解决办法
136
查看次数

标签 统计

c ×2

arrays ×1

c99 ×1

casting ×1

types ×1