影院时间显示程序

时间:2014-05-06 19:31:00

标签: c string struct copying

我一直在制作一个程序,从用户那里收到一部标题电影,是时候了。程序使用包含char标题[20]和char时间[20]数组的结构影片来输入字符串,然后我定义2个指针数组,将结构中扫描的字符串插入到它们中(指针数组)。扫描和复制是在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);
}

1 个答案:

答案 0 :(得分:2)

你需要阅读C中的字符串操作和指针。

以下代码行:

movieTitle[movieCount]=aMovie.title;
movieTime[movieCount]=aMovie.time;

您认为他们做了什么?复制字符串?不。他们复制指向字符串的指针。然后你回到你的循环并覆盖字符串(无论它们指向什么点都会返回新的东西)。

试试这个:

movieTitle[movieCount]=strdup(aMovie.title);
movieTime[movieCount]=strdup(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 **类型。