我正在尝试创建一个简单的C程序,从文件中读取字符串行然后将其输出到终端,但显然它一直在崩溃,我不知道我哪里出错...我怀疑它可能是我在代码中处理数组的方式,因为我仍然是C的新手,所以我仍然习惯于使用和声明数组的方式..
这就是我的代码目前的样子:
typedef struct my_string
{
char str[256]; // my string contains an array of 255 characters + null
} my_string;
//Output lines from the file into terminal
void print(int count, my_string a[20]) {
for (int i = 0; i < count; i++)
{
printf("%s\n", a[i]);
}
}
//Read lines from file
void read(FILE *file_ptr) {
int i;
int numberOfLines;
my_string lineArray[20];
fscanf(file_ptr, "%d\n", &numberOfLines);
for (i=0; i < numberOfLines; i++) {
fscanf(file_ptr, "%[^\n]\n", lineArray[i].str);
}
print(numberOfLines, lineArray);
}
void main()
{
FILE *file_ptr;
// open the file and read from it
if ((file_ptr = fopen("mytestfile.dat", "r")) == NULL)
printf("File could not be opened");
else {
read(file_ptr);
}
fclose(file_ptr);
}
我试图读取的文本文件是:
10
Fred
Eric
James
Jaiden
Mike
Jake
Jackson
Monica
Luke
Kai
由于
答案 0 :(得分:5)
一些事情。
1)main
的返回类型为int
而不是void
。
int main(){
...
}
2)如果您无法打开该文件,则不应关闭该文件。将fclose
移动到else语句中。
else{
read(file_ptr);
fclose(file_ptr);
}
3)在print
函数中,确保正在打印字符串而不是结构地址。编译器应该发出警告。
void print(int count, my_string a[20]) {
for (int i = 0; i < count; i++)
{
printf("%s\n", a[i].str); /* a[i].str not a[i]*/
}
}
答案 1 :(得分:2)
其中一个帖子已被接受作为此问题的答案,但它没有说明OP提出的问题的具体原因:
...but apparently it keeps crashing and I don't know where I went wrong.....
因此我发布了这个答案。
在print()
中,您希望打印从文件中读取的字符串,但是您将a[i]
作为printf()
的参数my_string
并使用%s
格式说明符来打印它。 %s
格式说明符期望参数是指向字符数组的初始元素的指针。这意味着参数my_string
不是%s
的正确类型,undefined behavior 。未定义的行为包括它可能执行不正确(崩溃或静默生成不正确的结果),或者它可能偶然地完成程序员的预期。
来自C标准#7.21.6.1p9
如果转换规范无效,则行为为 undefined .282)如果任何参数不是正确的类型 相应的转换规范,行为未定义 [强调我的]
在print()
函数中,您希望输出从文件中读取的行,因此printf()
的正确参数为a[i].str
。
void print(int count, my_string a[20]) {
for (int i = 0; i < count; i++) {
printf("%s\n", a[i].str);
}
}
由于您不熟悉C编程,请了解未定义的行为(如果您不熟悉它)。
您的计划中还有其他一些问题已经指出了另一个答案。