这是我得到的:
#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)
我试过在谷歌上搜索,找到了一个答案,但没有用。
2条答案
按热度按时间zzzyeukh1#
代码中没有任何内容会向输出文件输出空字节。文件在行尾包含字符
(null)
。原因是循环迭代到和包括argc
,因此使用printf
输出argv[argc]
,这是一个空指针,在目标系统上,fprintf
在本例中输出字符串"(null)"
。请改用标准循环:无需在
fopen
中使用"a+"
模式,"a"
就足够了,因为您从未读取过此文件。行
for (; i < strlen(task); i+=task[i]) ;
非常可疑,但是由于task
指向空字符串,因此循环立即退出。要输出字符串的一部分或不带空终止符的字符串,可以使用
fwrite(s, 1, length, file)
或printf("%.*s", length, str)
。rvpgvaaj2#
您的代码有很多问题,但导致输出中出现(nul)的问题如下:
具体来说,
i<=argc
是错误的,您的参数范围从0
到argc - 1
,因此它应该是i < argc
。但是,
argv[argc]
被定义为NULL,因此您可以“安全地”访问它而不会溢出数组,但是它将始终为NULL。fprintf()
是出于好意,将文本(null)
插入到输出流中,而不是导致segfault。