如何将命令行参数写入 C 中的文件而不写入 (null)? [已关闭]

问题描述 投票:0回答:2

我需要将传递给程序的参数输出到文件中。每次我这样做时,它都会在每行末尾输出

(null)

这就是我所拥有的:

#include <stdio.h>

int main(int argc, char *argv[]) {
    FILE *file = fopen("file.txt", "a+");
    
    for (int i = 1; i <= argc; i++) {
        fprintf(file, " %s", argv[i]);
    }

    fputs("", file); // add newline at the end

    fclose(file);
}

当我使用

cat
阅读文件时,我可以在行尾看到
(null)
。示例:

 asd def (null)
 second test (null)
c gcc c99
2个回答
3
投票

代码中的任何内容都不会向输出文件输出空字节。该文件的行尾包含字符

(null)
。原因是循环迭代到 ,包括
argc
,因此您使用
printf
来输出
argv[argc]
,这是一个空指针,并且在目标系统上,
fprintf
输出字符串
"(null)" 
在这种情况下。使用标准循环代替:

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

无需在

"a+"
中使用
fopen
模式,
"a"
就足够了,因为您从未读取过此文件。

for (; i < strlen(task); i+=task[i]) ;
行非常可疑,但由于
task
指向空字符串,因此循环立即退出。

要输出字符串的一部分或不带空终止符的字符串,可以使用

fwrite(s, 1, length, file)
printf("%.*s", length, str)


2
投票

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

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

具体来说,

i<=argc
是错误的,你的论点范围是从
0
argc - 1
,所以应该是
i < argc

但是,

argv[argc]
被定义为 NULL,因此您可以“安全”访问它而不会超出数组。但它永远是NULL。
fprintf()
对您很友善,并将文本
(null)
插入到输出流中,而不是导致段错误。

© www.soinside.com 2019 - 2024. All rights reserved.