Почему мой код выводит мусор из моего массива? - PullRequest
0 голосов
/ 24 марта 2019

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

#include <stdio.h>

int main(int argc, char** argv) {
char input[100];

while(1) {
    fgets(input, 100, stdin);

        for(int i = 99; i > -1; i--) {
            printf("%c", input[i]);
        }

    printf("\n");
    }
}

Вывод это правильно, но он также выводит некоторый мусор между ними, и я не понимаю, почему. Может кто-нибудь объяснить мне это?

Это вывод:

enter image description here

Ответы [ 2 ]

1 голос
/ 24 марта 2019

Юаньхуэй объяснил это довольно хорошо, поэтому я просто приведу некоторые улучшения в его коде:

int main() { // No need for argc and argv unless you use them
char input[100] = {0}; // Simpler than memset

do {
    // Security risk if you decide to change the size of input, so use
    // sizeof input instead of hard coded value. Also, check return value.
    if(!fgets(input, sizeof input, stdin)) { /* Error handling code */ }

    // Overkill to use printf for a single char
    for(int i = strlen(input); i > -1; i--) putchar(input[i]);
    putchar('\n');
} while(!feof(stdin)) // End the loop on EOF
}
1 голос
/ 24 марта 2019

Во-первых, вы должны очистить память перед использованием.

Во-вторых, всегда держите один символ со значением NULL в конце строки. (только вариант для вашего случая, потому что вы не используете sprintf, strcpy ... и т. д.)

В-третьих, цикл for должен начинаться с конца входа, то есть strlen(input), который расположен на <string.h>

#include <stdio.h>
#include <string.h>

int main(int argc, char** argv) {
char input[100];

while(1) {
    memset(input, 0, sizeof(input));    // add memset() to clear memory before using it
    fgets(input, 100, stdin);

    for(int i = strlen(input); i > -1; i--) {
        printf("%c", input[i]);
    }

    printf("\n");
    }
}
...