我需要将传递给程序的参数输出到文件中。每次我这样做时,它都会在每行末尾输出
(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)
代码中的任何内容都不会向输出文件输出空字节。该文件的行尾包含字符
(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)
。
您的代码有很多问题,但导致 (nul) 出现在输出中的问题如下:
for (unsigned short i=1; i<=argc; i++)
具体来说,
i<=argc
是错误的,你的论点范围是从0
到argc - 1
,所以应该是i < argc
。
但是,
argv[argc]
被定义为 NULL,因此您可以“安全”访问它而不会超出数组。但它永远是NULL。 fprintf()
对您很友善,并将文本 (null)
插入到输出流中,而不是导致段错误。