指针数组在c中存储字符串

时间:2015-11-02 20:43:33

标签: c arrays

我要编写一个存储字符串并打印最后两个字符串的程序 (我应该使用指针数组。)

这是我的代码

#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)

2 个答案:

答案 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每个指针稍后在数组中使用循环。