我一直在制作一个程序,从用户那里接收一部片名电影,现在是时候了。程序使用一个包含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 **
类型。