为什么我的代码会从数组中打印出一些垃圾?

时间:2019-03-24 07:40:07

标签: c string stdout

我目前正在学习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 个答案:

答案 0 :(得分:1)

首先,您应该先清除内存,然后再使用它。

第二,始终在字符串的末尾保留一个带有'NULL'值的字符。 (因为您没有使用sprintfstrcpy ...等,所以这是您的情况的唯一选择。)

第三,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");
    }
}

答案 1 :(得分:1)

Yuanhui解释得很好,因此我将对他的代码进行一些改进:

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
}