C - 我认为我以错误的方式声明和使用数组

时间:2018-06-03 03:45:52

标签: c

我正在尝试创建一个简单的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

由于

2 个答案:

答案 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编程,请了解未定义的行为(如果您不熟悉它)。

您的计划中还有其他一些问题已经指出了另一个答案。