2013-09-11 19 views
-1

Мне нужно создать программу, которая читает строку «A = B» и выполняет поиск B в массиве переменных. Если он не находит B, он запрашивает его значение и помещает его в другой массив. Ну, я не знаю, если идея ясна, но вот пример:Программа «двойное чтение» строка

while(1){ 
    printf("Get string\n"); 
    gets(L); 


    if(L[0]=='\0') break; 

    if(L[2] == '1') { 
      printf("Value of 1: "); 
      scanf(" %lf", &m); 

      } 

      } 
    printf("\nbreak"); 

Мне нужно, что эта программа останавливается, когда мы набираем войти, так что я использовал, если (L [0] ==» \ 0 ') перерыв; для этого.

Моя проблема: каждый раз, когда я спрашиваю значение B, моя программа читает «строку-призрак» L, это значит, что я не могу поставить значение L и программа останавливается. Это почти двойное чтение строки, но оно ломается из-за условия L [0]! = '\ 0'. Что я делаю не так? Если мы удалим это условие, тогда программа напечатает 2 раза «Получить строку», не прося меня ввести строку 2 раза.

+1

Почему бы вам не потратить немного времени, чтобы прояснить ваш комментарий. Это поможет всем нам. – Andromeda

+0

Арадом, извините, если не ясно. Мне нужно сделать компилятор для арифметических выражений, и если переменная не находится в массиве переменных, когда я пытаюсь прочитать ее значение, моя программа также читает пустую строку L, прежде чем она попросит ввести другую строку L – Giiovanna

ответ

2

Не использовать (0) gets(). Это не хорошо.

Вместо этого используйте fgets(), отметив, что он хранит перевод строки. Используйте некоторую функцию более высокого уровня (например, sscanf()), чтобы разобрать вход. Аналогично используйте другую команду fgets() + sscanf(), чтобы выполнить чтение значения.

0

Вы делаете это неправильно, поскольку вы никогда не проверяете наличие ошибок (включая конец файла). Вот почему вы читаете дважды.

Вместо этого, например,

while ((fgets(L, sizeof(L), stdin) != NULL) 
{ 
    /* ... */ 
} 
+0

Спасибо за помощь, но можете ли вы помочь мне немного больше? У меня нет опыта работы с этой функцией, поэтому я думаю, что не использую ее правильно. Должен ли я продолжать получать? Когда я его сохраню, моя программа должна прочитать строку дважды, чтобы задать значение 1. И когда я не буду ее хранить, он будет продолжать задавать значение 1. – Giiovanna

0

Вы сканируете f не использует ограничитель линии, только то, что набирается перед ним. Таким образом, get() затем видит терминатор линии и возвращает пустую строку.

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