我一直在制作一个程序,从用户那里接收一部片名电影,现在是时候了。程序使用一个包含char title[20]和char time[20]数组的struct movie来输入字符串,然后我定义了两个指针数组,将扫描到的字符串从结构插入其中(指针数组)。扫描和复制在一个while循环中,在电影标题中输入-1时停止。
到目前为止,它运行良好,但当我退出循环我的插入- 1,并打印电影名称和时间,输出原来是所有的1,电影标题,只是最后的时间电影时间。如果有什么不清楚的,请问我。请帮忙。这是代码:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

struct movie {
    char title[20];
    char time[20];
};

char *movieTitle[20],*movieTime[20];
int movieCount=0;

int main() {

    struct movie aMovie={"Hello","Hello"};

    puts("*****Welcome to VOX cinemas*****");
    puts("Please enter the movie title (enter -1 to end):");
    scanf("%s" ,&aMovie.title);

    while(aMovie.title[0]!='-'||aMovie.title[1]!='1') {
        puts("Please enter the movie's time");
        scanf("%s" , &aMovie.time);
        movieTitle[movieCount]=aMovie.title;
        movieTime[movieCount]=aMovie.time;
        printf("movieTitle[%d]=%s\n",movieCount,movieTitle[movieCount]); //a checking print
        printf("movieTime[%d]=%s\n",movieCount,movieTime[movieCount]);  //a checking print
        movieCount++;
        puts("Please enter the movie title (enter -1 to end):");
        scanf("%s", &aMovie.title);
    }

    printf("%s",movieTitle[0]);
    int numberOfMovies=movieCount;
    puts("********************************\n\n\nMovie Title\t\tMovie Time");

    for(movieCount=0;movieCount!=numberOfMovies;movieCount++) {
        printf("%s\t\t\t%s\n", movieTitle[movieCount],movieTime[movieCount]);
    }

    while(1);
}

最佳答案

您需要阅读C.和指针中的字符串操作。
以下代码行:
movieTitle[movieCount]=aMovie.title;
movieTime[movieCount]=aMovie.time;
你认为他们做什么?复制字符串?不。他们把指针复制到字符串。然后回到循环中覆盖字符串(无论指向它们的是什么,都将返回新的内容)。
试试这个:
movieTitle[movieCount]=strdup(aMovie.title);
movieTime[movieCount]=标准时间(aMovie.time);
它分配新内存并在其中存储字符串的副本。您应该了解内存分配和泄漏,但对于粘贴的内容,这可能已经足够好了:D
编辑:
还有一些提示:
不正确:scanf("%s", &aMovie.title);
正确:scanf("%s", aMovie.title);
不正确:scanf("%s", &aMovie.time);
正确:scanf("%s", aMovie.time);
这是因为char s[20]已经是指向预先分配的20字节字符串的指针。s是char *类型。&s将是指向指针的指针。它将具有char **类型。

10-07 14:14