2014-10-18 7 views
1

Это функция для чтения символа из файла и размещения, затем преобразования строки в поплавок, но цикл while не заканчивается, когда считывается '/ 0'.Пока цикл не заканчивается на ' 0'

GSF555 "Газовый фильтр - Ford Escort" 64,50 9 < - это то, что читается, но от "64,50"

PKL070 "Парк Lens - Toyota Corolla" 36,50 8

Петля пока идет мимо '/ 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); 
} 
+0

'str' не обязательно имеет нулевой символ, который заканчивается перед его печатью. – chux

ответ

2

Я не уверен, что я вижу в вашем посте, где \ 0, о котором идет речь, есть, но я вижу пару проблем.

Во-первых, fgetc возвращает целое число, а не символ. Это может быть важно для тестирования для конца файла, поскольку EOF является целым числом со значением -1, а не символом, который обычно принимает значения 0-255. Вы можете изменить объявление ch как int, а не char. (Не беспокойтесь, это не повлияет на печать ch с% c.)

Кроме того, если вы пытаетесь обнаружить конец строки путем тестирования с помощью \ 0, это может не сработать. Конечная строка - это новая строка, \ n. В зависимости от базовой операционной системы это может быть два символа, а не один. Вы должны иметь возможность сравнить ch, если объявлено как int для символа новой строки, но может не работать, если вы храните ch как символ, если это то, что вы пытаетесь сделать.

+0

Я не читаю до конца строки, как я сказал выше, он начинается с «6» и, предположим, заканчивается «0», давая вам «6.50» в конце функции. – PinC

+0

@hinkatana '0' и '\ 0' вовсе не одно и то же. –

+0

Я думаю, что вместо ch! = '0' вы можете использовать isdigit (ch) в условии while. Это остановит цикл при чтении пробела. Вам нужно будет добавить #include в верхней части программы. – Edward

1

цикл while не завершается при чтении «/ 0».

Нет такой вещи, как '/ 0' (запрет многобайтовых символов для педантов), а '\ 0' - это NUL, тогда как «0» - это цифра нуля. Поэтому замените эти «\ 0» в вашей программе «0». Хотя поиск «0» является нечетным; гораздо чаще приходится искать разделитель, например пробел (или любую другую не цифру), которая приходит после номера.

+0

Во-первых, я не могу гарантировать, что цена за элемент будет заканчиваться на «0», предположим, что у него «999.99», поэтому зачем мне заканчивать с «0», я хочу номер. – PinC

+0

@hinkatana Вы ** писали ** ', предположим, что закончите с «0», поэтому я заставил вас означать, что вы хотели искать «0»; * как я писал в своем ответе *, это странная вещь. Я понятия не имею, почему вы ищете «\ 0», поскольку на входе нет ни одного, ни после, ни по другому. * Как я писал в своем ответе *, вы должны искать пробелы, которые следует за номером. –

Смежные вопросы