gcc 如何在C中不写(null)的情况下将字符串写入文件?

xjreopfe  于 2023-03-08  发布在  其他
关注(0)|答案(2)|浏览(128)

这是我得到的:

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

int main(int argc, char* argv[]) {
    
    unsigned short index;
    
    srand(time(NULL));
    index = rand(); 

    char * task = "";
    
    unsigned short i=0;
    
    for (; i < strlen(task); i+=task[i]) ;

    index = (index + i) % 999;

    FILE * file = fopen("file.txt", "a+");
    fprintf(file, "%03hu", index);
    
    for (unsigned short i=1; i<=argc; i++) {
        fprintf(file, " %s", argv[i]);
    }
    
    fwrite("\n", 1, 1, file); // was a solution to a similar question, still prints null characters
    // fprintf(file,"\n") and fputs(file,"\n") also print a null character into a file

    fclose(file);
}

当我使用cat读取文件时,我可以在行的末尾看到(null)。

559 asd (null)
035 asd (null)
065 asd (null)
790 asd (null)
799 asd (null)

我试过在谷歌上搜索,找到了一个答案,但没有用。

zzzyeukh

zzzyeukh1#

代码中没有任何内容会向输出文件输出空字节。文件在行尾包含字符(null)。原因是循环迭代到和包括argc,因此使用printf输出argv[argc],这是一个空指针,在目标系统上,fprintf在本例中输出字符串"(null)"。请改用标准循环:

for (int i = 0; i < argc; i++) {
    fprintf(file, " %s", argv[i]);
}
fprintf(file, "\n");

无需在fopen中使用"a+"模式,"a"就足够了,因为您从未读取过此文件。
for (; i < strlen(task); i+=task[i]) ;非常可疑,但是由于task指向空字符串,因此循环立即退出。
要输出字符串的一部分或不带空终止符的字符串,可以使用fwrite(s, 1, length, file)printf("%.*s", length, str)

rvpgvaaj

rvpgvaaj2#

您的代码有很多问题,但导致输出中出现(nul)的问题如下:

for (unsigned short i=1; i<=argc; i++)

具体来说,i<=argc是错误的,您的参数范围从0argc - 1,因此它应该是i < argc
但是,argv[argc]被定义为NULL,因此您可以“安全地”访问它而不会溢出数组,但是它将始终为NULL。fprintf()是出于好意,将文本(null)插入到输出流中,而不是导致segfault。

相关问题