как запретить моей программе пропускать символы перед их сохранением - PullRequest
0 голосов
/ 27 марта 2019

Я делаю простую программу для чтения из файла посимвольных символов, помещаю их в tmp и затем помещаю tmp в input [i]. Тем не менее, программа сохраняет символ в tmp, а затем сохраняет следующий символ в input [i]. Как мне сделать так, чтобы не пропустить этот первый символ?

Я сразу попытался прочитать данные на входе [i], но потом я не смог проверить флаг EOF.

FILE * file = fopen("input.txt", "r");
char tmp;
char input[5];
tmp= getc(file);
input[0]= tmp;
int i=0;
while((tmp != ' ') && (tmp != '\n') && (tmp != EOF)){
    tmp= getc(file);
    input[i]=tmp;
    length++;
    i++;
}
printf("%s",input);

Предполагается, что будет напечатано «ADD $ 02», но вместо этого будет напечатано «DD 02».

1 Ответ

0 голосов
/ 27 марта 2019

Вы делаете вещи в неправильном порядке в вашем коде: то, как ваш код структурируется, чтение и сохранение первого символа перемещается из цикла.В цикле этот символ затем перезаписывается.В этом случае начните с i = 1.

Возможно, вы все равно хотите прочитать первый символ, но я думаю, что вы хотите прочитать все до первого пробела, который может быть первым символом.Затем сделайте следующее:

#include <stdio.h>

int main(void)
{
    char input[80];
    int i = 0;
    int c = getchar();

    while (c != ' ' && c != '\n' && c != EOF) {
        if (i + 1 < sizeof(input)) {         // store char if the is room
            input[i++] = c;
        }

        c = getchar();
    }

    input[i] = '\0';                         // null-terminate input

    puts(input);

    return 0;
}

На заметку:

  • Первый символ читается перед циклом.условие цикла и код, который хранит символ, затем используют этот символ.Непосредственно перед концом тела цикла читается следующий символ, который затем будет обработан в следующей итерации.

  • Вы не навязываете, что буфер символов input не можетбыть перезаписанЭто опасно, особенно потому, что ваш буфер крошечный.

  • Когда вы строите строки char по char, вы должны завершить его нулем, поместив в конце явный '\0'.Вы должны убедиться, что есть место для этого терминатора.Почти все системные функции, такие как puts или printf("%s", ...), ожидают, что строка будет заканчиваться нулем.

  • Получите результат getchar и int, чтобы вы могли различатьмежду всеми действительными кодами символов и специальным значением EOF.

Приведенный выше код полезен, если первый и последующие вызовы для получения следующего элемента отличаются, например, при токенизации строкис strtok.Здесь вы также можете выбрать другой подход:

    while (1) {                          // "infinite loop" 
        int c = getchar();               // read a char first thing in a loop

        if (c == ' ' || c == '\n' || c == EOF) break;
                                         // explicit break when done

        if (i + 1 < sizeof(input)) {
            input[i++] = c;
        }
    }

Этот подход имеет логику обработки символов только в теле цикла, но вы должны заключить его в бесконечный цикл, а затем использовать явный break.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...