程序输出奇怪字符,即使字符串已经以null结尾

3
我正在编写一个程序来读取标准输入并输出它。
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的字符串并从stdin中读取9个字节到它里面,然后将'\0'放在第9个位置。

当我运行这个程序时,得到的结果是:

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

打印出了两行文字和多余的字符(向右滚动以查看)。

这可能是什么原因造成的?


我在创建数组时应该这样做吗? - kettlepot
@GabrieleCirulli 对不起,我看错了。(失败了。) - Mateen Ulhaq
3个回答

9

inputStr不是一个字符串。

char* inputStr[10];

这是一个包含10个char *的数组。你需要将声明更改为char inputStr[10];


谢谢。您能否解释一下何时应该使用'char *'? - kettlepot
实际上,看起来即使更改了inputStr的声明,它仍然打印出多余的字符。 - kettlepot
当使用char inputStr[10]时,我不需要释放任何内存,对吗? - kettlepot
你这样会覆盖掉最后读取的字符,应该是 inputStr[readChars] = 0; - Daniel Fischer
你说得对,但为什么呢?readChars不是从1开始的数量吗?如果我想将其用作索引,难道不应该减去1使其从0开始,就像索引一样吗?请原谅我们的长时间讨论,但我真的很想了解这些问题的根源。 - kettlepot
显示剩余4条评论

2
@DanielFischer已经指出了你的直接问题,但是一旦你解决了char[]char*[]的问题,你还应该注意...。
如果test.txt中包含少于9个字符,则在最后读取的字符和写入空终止符的位置之间仍会有垃圾字符。
你应该检查fread的返回值,以查看读取了多少个字符,并在适当的位置写入空终止符。

谢谢,现在看起来运行良好。作为另一种选择,是否可以在从stdin获取输入之前用'\0'填充字符串,以便剩余的字符被设置为'\0'? - kettlepot
@GabrieleCirulli:是的,但检查返回值仍然是个好主意。它还会告诉你调用是否失败。 - CB Bailey
当然可以,char inputStr[10] = {0}; 就可以实现。 - Daniel Fischer
这样做是否有不良实践的问题? - kettlepot

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[]

上述代码片段不完整,缺少错误检查、输入验证等。


我已经按照上面的答案建议,在正确的位置添加了空终止符,还有什么其他步骤我应该遵循以确保输入有效? - kettlepot
您应该输入有效的字符,超过9个字符将被忽略。为了确保,您可以检查fread()函数的返回值。除此之外,我想您不必担心。如果您认为上述代码已经回答了问题,请通过点击答案旁边的勾号进行确认。谢谢 :) - Sangeeth Saravanaraj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接