实现指向字符串的指针数组的可能方法

时间:2013-06-19 14:56:51

标签: c arrays pointers

我有一个适用于整数的代码

#include<stdio.h>

int main()
{
    int i;
    int* p[5];  

    printf("Enter the elements to be shorted");

    for(i=0;i<=4;i++)
    {
        scanf("%d\n",&p[i]);
    }
    for(i=0;i<=4;i++)
    {
        printf("entered  [%d] integers are = %s",i, p[i]);
    }
    return 0;
}

产生输出

Enter the strings to be shorted1
2
3
4
5
6
enetered  [0] string is = 1 
enetered  [1] string is = 2 
enetered  [2] string is = 3 
enetered  [3] string is = 4 
enetered  [4] string is = 5 

但是当我将limne int * p [5]更改为char * p [5]以将其用作指向字符串的指针数组并在上面的代码中进行必要的更改时,它会产生分段错误。我读了一本书我们不能这样做,因为一些垃圾值将被分配给指向字符串的指针数组。所以可以通过指向字符串的数组来实现上述代码。

我想要做的是将字符串作为用户的输入并将它们存储在指向字符串的指针数组中,然后在初始阶段将它们打印出来。我正在尝试编写最简单的字符串短路。

3 个答案:

答案 0 :(得分:2)

请务必为字符串中的字符预留空间:

char p[5][128];

并确保在读取时限制长度,因此scanf()不会在缓冲区外写入​​:

if(scanf("%127s", p[i]) == 1)
{
  p[i][127] = '\0'; /* Make sure it's terminated. */
}

答案 1 :(得分:0)

首先,在第一次测试中,int数组定义是错误的。它应该是

int p[5]; 

其次,您必须为数组中的每个指针分配内存。数组char *p[5];中的每个元素都是一个指针。

您可以直接使用scanf

char *p[5];
for(i=0;i<=4;i++)
{
scanf("%ms\n",&p[i]);
}

但这不适用于gcc&gt; gcc2.7

或者您必须在每次scanf()

之前分配内存
char *p[5];
for(i=0;i<=4;i++)
{
p[i]=calloc(100,1);
scanf("%99s\n",p[i]);
}

答案 2 :(得分:0)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void){
    int i;
    char *p[5];  

    printf("Enter the string\n");

    for(i=0;i<=4;i++){
        char buff[128];
        scanf("%127s", buff);
        p[i] = strdup(buff);
    }
    for(i=0;i<=4;i++){
        printf("entered  [%d] string is = %s\n", i+1, p[i]);
    }
    for(i=0;i<5;++i) free(p[i]);
    return 0;
}