在 C 语言中将 char 数组写入文件时出现分段错误



当我运行以下代码时,我在fprintf(outfile, "%s", inputline[j]);处出现"分段错误"。

我无法理解错误的原因是什么。我对 C 比较陌生,有人可以帮我解决错误吗?

void test(char *inputline) {
FILE *outfile = fopen("results.txt", "w");   
if (!outfile) {
perror("Error while opening file: ");
} else {
for (int j = 0; j < 20; ++j) { // I only want to be write the first 20 characters to the file that is why I have the iteration till only 20 and added [j], is that correct way to do it?
fprintf(outfile, "%s", inputline[j]);
}
}
}
//Function call
...
char inputline[40] = "hello world 123 456"; //passed to the function above
test(inputline);

格式说明符%s

fprintf(outfile, "%s", inputline[j]);

需要一个char *变量,但您实际上是在传递一个char(inputline数组的第 j元素(。

发生分段错误的原因是fprintf尝试"访问"由传递的字符放置的内存位置。而且由于它很可能是一个无效的地址,操作系统将抱怨试图访问分配给应用程序的空间之外的内存。

您可以逐个字符打印到文件字符,保留 for 循环并使用%c格式

for(int j=0; j<20; ++j)
{
fprintf(outfile, "%c", inputline[j]);
}

或者打印整个字符串保持%s格式,传递整个数组并摆脱 for 循环:

fprintf(outfile, "%s", inputline);

注意:在第一种情况下,无论如何都会写 20 个字符。在第二种情况下,由于字符串终止符''.

代码中导致分段错误的错误是,您将charinputline[j]传递给%s参数的printf,该参数需要字符串指针。这具有未定义的行为。

要最多写入字符串的前 20 个字符,可以使用%.20s作为格式说明符。另外不要忘记关闭文件:

void test(const char *inputline) {
FILE *outfile = fopen("results.txt", "w");   
if (outfile == NULL) {
perror("Error while opening file: ");
} else {
// print at most 20 bytes from inputline
fprintf(outfile, "%.20sn", inputline);
fclose(outfile);
}
}

请注意,如果需要,此最大计数可以是具有%.*s格式的变量:

int limit = 20;
fprintf(outfile, "%.*sn", limit, inputline);

相关内容

  • 没有找到相关文章

最新更新