我正在编写一个C程序,首先打开并阅读50个电影片名的文件,每个片段写在一行上。接下来,我试图将文件的每一行(或电影标题)分配到名为FilmArray [51]的数组的每个元素中。我使用strcpy()来执行此操作,但程序每次到达strcpy的第一个循环时都会崩溃,而我似乎无法弄清楚我哪里出错...
int main()
{
int i=0;
char array[51];
char FilmArray[51];
bool answer;
FILE *films;
films = fopen("filmtitles.txt", "r");
if(films == NULL){
printf("\n ************* ERROR *************\n");
printf("\n \"filmtitles.txt\" cannot be opened.\n");
printf("\n PROGRAM TERMINATED\n");
exit(EXIT_FAILURE);
}
while(fgets(array, sizeof array, films) != NULL){
printf("%d. %s",i, array);
strcpy(FilmArray[i], array);
i++;
}
答案 0 :(得分:3)
FilmArray
是字符的数组,而不是字符串数组。
所以当你做
时strcpy(FilmArray[i], array);
编译器会将FilmArray[i]
中的值转换为指针,并将其用作字符串的目标。这将导致undefined behavior。
事实上,编译器应该对此大声警告,如果它没有,那么你需要启用更多警告,因为警告是关于编译器认为可疑的事情的消息并且可能导致UB
答案 1 :(得分:0)
您的代码实际上是尝试将char
传递给指向char *
类型参数的指针转换。尝试使用&
和strcpy:
strcpy(&FilmArray[i], array);
&
指定使用指针FilmArray[i]
答案 2 :(得分:0)
suggest the following code
which compiles with no errors/warnings
is complete (given the posted code)
eliminates a lot of the code clutter
eliminates the 'magic' numbers buried in the code
#include<stdio.h>
#include<stdlib.h>
#define MAX_NUM_FILMS (51)
#define MAX_FILM_TITLE_LEN (51)
int main()
{
int i=0;
char FilmArray[ MAX_NUM_FILMS ][ MAX_FILM_TITLE_LEN ] = {{'\0'}};
FILE *films;
films = fopen("filmtitles.txt", "r");
if(films == NULL)
{
printf("\n ************* ERROR *************\n");
printf("\n \"filmtitles.txt\" cannot be opened.\n");
printf("\n PROGRAM TERMINATED\n");
exit(EXIT_FAILURE);
}
// implied else, fopen successful
while(fgets(&FilmArray[i][0], MAX_FILM_TITLE_LEN, films))
{
printf("%d. %s\n",i, FilmArray[i]);
i++;
}
// other code here
fclose( films ); // cleanup
return(0);
} // end function: main