我一直在制作一个程序,从用户那里收到一部标题电影,是时候了。程序使用包含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);
}
答案 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 **
类型。