Почему в функции scanf () есть -35? - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть файл data.txt, и мне нужно читать различные числа целых чисел в каждой строке для дальнейшей обработки, а некоторые, возможно, пустую строку.

//data.txt
3 7 2 1 9
8

234 0 2 -1

И я использую программу для его чтения.

int main() {
    FILE *fp=fopen("data.txt","r");
    char input;
    int temp;
    if(fp==NULL){
        perror("Cannot open file!\n");
        exit(1);
    }

    while(!feof(fp)){
        while(fscanf(fp,"%c",&input)==1){
            if(input==' '){
                printf(" ");
                continue;
            }
            else if(input=='\n') {
                printf("This line finished.\n");
                continue;
            }
            else if(input=='-'){
                fscanf(fp,"%c",&input);
                temp=-(int)(input-'0');
                printf("%d",temp);
                continue;
            }
            temp=(int)(input-'0');
            printf("|%d|",temp);
        }

    }
    fclose(fp);
    return 0;
}

И я получаю странные результаты с -35 в каждой строке.

|3| |7| |2| |1| |9||-35|This line finished.
|8||-35|This line finished.
|-35|This line finished.
|2||3||4| |0| |2| -1
Process finished with exit code 0

Кто-нибудь знает, что не так с моей программой?

1 Ответ

1 голос
/ 18 апреля 2020

temp=(int)(input-'0');

Вы вычитаете 48 (ASCII 0) из любого введенного вами значения и получаете -35. Это означает, что вы вводите 13. Быстрая проверка в таблице ASCII показывает, что 13 - это \ r, а именно возврат каретки.

Я предполагаю, что вы на платформе Windows. Windows использует \ r \ n для новых строк, вы печатаете \ r как -35, а когда вы переходите к \ n, вы печатаете "Эта строка закончена".

...