即使字符串以空值终止,程序也会输出奇怪的字符

时间:2011-12-29 22:43:09

标签: c file

我正在编写一个程序来读取stdin并输出它。

int main() {
    FILE* inputF = stdin;
    char* inputStr[10];

    fread(inputStr, 1, 9, inputF);
    if(ferror(inputF)) {
        printf("An error occurred");
        return 0;
    }

    inputStr[9] = '\0';

    printf("%s", (const char*)inputStr);

    return 0;
}

它应该创建一个10个字符长的字符串并读入9个字节的stdin,然后将'\0'放在第9位。

当我运行程序时,结果如下:

gab@testvm:~/work/c/fibo$ ./a.out < test.txt
56                                                                                                     `ô
                                                                                                       ga

打印两行和多余字符(向右滚动以查看它们)。

可能导致这种情况的原因是什么?

3 个答案:

答案 0 :(得分:9)

inputStr不是字符串,

char* inputStr[10];

这是一个10 char *的数组。您应该将声明更改为char inputStr[10];

答案 1 :(得分:2)

@DanielFischer指出了您的直接问题,但是一旦您修复了char[]char*[]问题,您还应该注意......

如果test.txt包含少于9个字符,那么在最后读取的字符和写入空终止符的位置之间仍然会有垃圾字符。

您应该检查fread的返回值,以查看读取的字符数,并在适当的位置写入空终止符。

答案 2 :(得分:1)

#include <stdio.h>

int main(void) 
{
    FILE* inputF = stdin;
    char inputStr[10];

    fread(inputStr, 1, 9, inputF);

    inputStr[9] = '\0';
    printf("%s \n", inputStr);

    return 0;
}

$ gcc run.c 
$ ./a.out 
123456789
123456789 
$ 

您需要char a[]char *,但不需要char *a[]

上面的代码段不完整,因为它缺少错误检查,输入验证等等。

相关问题