fgets()和strcpy()的问题

时间:2015-03-04 00:09:56

标签: c fgets strcpy

我正在编写一个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++;
}

3 个答案:

答案 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