【问题标题】:While loop not terminating with '\0'While 循环不以 '\0' 结束
【发布时间】:2014-10-18 00:23:49
【问题描述】:

这是一个从文件中逐个字符读取并放置然后将字符串转换为浮点数的函数,但是当读取“/0”时,while循环不会终止。

GSF555 "Gas Filter - Ford Escort" 64.50 9

PKL070“驻车镜 - 丰田卡罗拉”36.50 8

while 循环越过“/0”,还从下一行数据中读取“9”和字符。

我只有printf 来看看出了什么问题。

float getPrice(FILE * in){
    char ch;
    int i = 0;
    char str[10];
    ch = fgetc(in);
    printf("INDEX + NUMBER = %d %c\n", i, ch);
    if(ch == '\0')
        ch = fgetc(in);
    str[i++] = ch;
    while(ch != '\0' && i < 10){
        str[i++] = ch;
        printf("Index I = %d\n", i);
        ch = fgetc(in);
        printf("3 %c\n",ch);
    }
    printf("STRING = %s\n", str);
    return atof(str);
}

【问题讨论】:

  • str 在打印之前不一定是空字符。

标签: c loops while-loop character


【解决方案1】:

从我在您的帖子中看到的内容中,我不确定您所指的 \0 在哪里,但我可以看到一些问题。

首先,fgetc 返回一个整数,而不是一个字符。这对于测试文件结尾可能很重要,因为 EOF 是一个值为 -1 的整数,而不是一个通常取值为 0-255 的字符。您可以将 ch 的声明更改为 int,而不是 char。 (不用担心,这不会影响 ch 与 %c 的打印。)

另外,如果您尝试通过使用 \0 进行测试来检测行尾,它可能无法正常工作。行尾是换行符,\n。根据底层操作系统,这可能需要两个字符,而不是一个。如果声明为 int,您应该能够将 ch 与换行符进行比较,但如果您将 ch 保留为 char(如果您正在尝试这样做),则它可能不起作用。

【讨论】:

  • 我不会读到行尾,正如我上面所说的,它将从“6”开始,并假设以“0”结束,在末尾给你“6.50”功能。
  • @hinkatana '0' 和 '\0' 根本不是一回事。
  • 我认为除了 ch != '0' 你可以在 while 条件下使用 isdigit(ch) 。这将在读取空间时停止循环。您需要在程序顶部添加#include
【解决方案2】:

读取“/0”时,while 循环不会终止。

没有像 '/0' 这样的东西(禁止多字节字符,对于书呆子来说),并且 '\0' 是 NUL 而 '0' 是零位。因此,将程序中的那些 '\0' 替换为 '0'。虽然寻找“0”很奇怪;寻找分隔符更为常见,例如数字后面的空格(或任何其他非数字)。

【讨论】:

  • 首先我不能保证一件商品的价格会以“0”结尾,假设它有“999.99”那么我为什么要以“0”结尾,我想要这个数字。
  • @hinkatana 你 '应该以“0”'结尾,所以我认为你的意思是你想寻找一个'0'; 正如我在回答中所写的那样,这是一件很奇怪的事情。我不知道您为什么要查找“\ 0”,因为输入中、数字之后或其他任何地方都没有。 正如我在回答中所写的,您应该寻找数字后面的空格。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-20
  • 2016-06-14
  • 2014-04-20
  • 2014-10-31
  • 2019-03-15
  • 2016-02-08
  • 1970-01-01
相关资源
最近更新 更多