当我运行以下代码时,我在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 个字符。在第二种情况下,由于字符串终止符' '
.
代码中导致分段错误的错误是,您将char
值inputline[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);