0

我有一个代码可以很好地处理整数

#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] 以将其用作指向字符串的指针数组并在上述代码中进行必要的更改时,它会产生分段错误。我读了一本我们不能读的书这样做是因为一些垃圾值将被分配给指向字符串的指针数组。那么用指向字符串的指针数组实现上述代码的可能方法是什么。

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

4

3 回答 3

2

确保为字符串的字符预留空间:

char p[5][128];

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

if(scanf("%127s", p[i]) == 1)
{
  p[i][127] = '\0'; /* Make sure it's terminated. */
}
于 2013-06-19T15:01:01.120 回答
0

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

int p[5]; 

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

可以直接通过scanf使用

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

但这不是可移植的,仅适用于 gcc>gcc2.7

或者您必须每次之前都分配内存scanf()

char *p[5];
for(i=0;i<=4;i++)
{
p[i]=calloc(100,1);
scanf("%99s\n",p[i]);
}
于 2013-06-19T15:05:43.550 回答
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;
}
于 2013-06-19T15:24:57.283 回答