我要编写一个存储字符串并打印最后两个字符串的程序 (我应该使用指针数组。)
这是我的代码
#include<stdio.h>
#include <string.h>
main()
{
char*arr[10];
char student_name[20];
int i,j;
for(i=0;i<10;i++) {
printf("Enter the name of student %d : ",(i+1));
scanf("%s",student_name);
arr[i]=student_name;
}
for(j=7;j<10;j++) {
printf("the name of student %d : %s\n",(j+1),arr[j]);
}
}
它只存储最后一个字符串并将其打印出来
这是samle run
Enter the name 1 : qqq
Enter the name 2 : www
Enter the name 3 : eee
Enter the name 4 : rrr
Enter the name 5 : ttt
Enter the name 6 : yyy
Enter the name 7 : uuu
Enter the name 8 : ii
Enter the name 9 : ioo
Enter the name 10 : ppp
the name 9 : ppp
the name 10 : ppp
我的错误是什么?
如果我重新播放
arr[i]=student_name;
与
strcpy(arr[i], student_name);
the sumple run
Enter the name 1 : ddf
Segmentation fault (core dumped)
答案 0 :(得分:3)
您正在做的只是将student_name
的指针分配给所有数组元素,这些数组元素将在while循环的每次迭代中被替换。相反,您应该使用strdup
将字符串保存在数组中。为防止溢出错误,您应该在19处截断学生姓名,因为数组的长度为20,这将具有nul终止符。这可以使用特殊格式%19s
完成。
您永远不会为使用malloc
或使用strdup
功能为您完成的字符串分配内存。
for(i=0;i<10;i++){
printf("Enter the name of student %d : ",(i+1));
scanf("%19s",student_name);
arr[i] = strdup(student_name);
}
此外,您应该在退出前释放内存。打印字符串后即可执行此操作。
for(i=0;i<10;i++){
free(arr[i]);
}
答案 1 :(得分:3)
确实你有一系列指针。如果你想在每个指针所指向的内存中写入内容,你需要为每个指针分配一些有效的内存 - 你可以写入的位置。你可以这样做:
for(int i = 0; i <10; i++)
arr[i] = malloc(MAX_LEN); // Initialize each pointer to point to valid memory
现在,您可以将字符串用户复制到每个指针所指向的内存:
scanf("%s",student_name);
strcpy(arr[i],student_name);
这样我们就会复制用户输入的内容。你拥有它的方式 - 你将数组中的每个指针指向相同的地址 - 数组student_name
的第一个元素的地址。因此,数组中的所有指针都指向相同的内存位置(内存位置保持不变,即student_name
“生活”的位置)。如果在这种情况下你尝试打印每个指针的内容,它们都将打印相同的值 - 存储在地址student_name
的数据。
最后,free
每个指针稍后在数组中使用循环。