字符串的动态内存分配

时间:2013-10-29 06:04:34

标签: c string pointers malloc gets

int ReadNames(char ***Names, int *n)    
{    
int i, k;    
char name[100];    
printf("Enter how many names\n");    
scanf("%d", n);       
/* Allocate memory and read names */
*Names=(char **)malloc((*n)*sizeof(char *));
for(i=0;i<(*n);i++)
{
    *(*Names+i)=(char*)malloc(sizeof(name));
    gets(name);
    strcpy(*(*Names+i),name);
}

for(i=0;i<(*n);i++)
    printf("%s\n",*(*Names+i));
return 1;
}    
void main()        
{
char **Names;
int n, i;
ReadNames(&Names, &n);
}

这个程序运行正常......但与我的预期略有不同。问题是当我输入'n'的值为3时,它只能读取2个字符串并打印这两个字符串....即。它读取n-1个字符串并打印n-1个字符串。我的代码有什么问题。

3 个答案:

答案 0 :(得分:2)

只需在getchar()

之后添加scanf()即可

以便在接受输入时处理每个'\n'。 您的代码将是

int ReadNames(char ***Names, int *n)
{
    int i, k;
    char name[100];
    printf("Enter how many names\n");
    scanf("%d", n);
    getchar(); // eats unnecessary '\n' in the buffer
    /* Allocate memory and read names */
    *Names=(char **)malloc((*n)*sizeof(char *));
    for(i=0;i<(*n);i++)
    {
            *(*Names+i)=(char*)malloc(sizeof(name));
                gets(name);
                    strcpy(*(*Names+i),name);
    }

    for(i=0;i<(*n);i++)
            printf("%s\n",*(*Names+i));
    return 1;
}
void main()
{
    char **Names;
    int n, i;
    ReadNames(&Names, &n);
}

答案 1 :(得分:1)

您遇到的问题很可能是因为您用于获取计数的scanf使换行仍然在缓冲区中。这意味着第一个gets调用会读取该单个换行符并添加该空行。

一个简单易用的解决方案是在scanf格式之后添加一个空格,告诉scanf跳过所有空格。像

scanf("%d ", n);

答案 2 :(得分:1)

1.请不要使用gets()使用fgets()代替。

 fgets(name, sizeof name,stdin);

在输入结束时删除换行符。

2.在scanf()输入后,您应该按 Enter
gets()将此换行符作为第一个字符串的输入。

几乎没有简单的解决方案

使用getchar()scanf()

之后阅读换行符

%d

中的scanf()之后添加空格

如果您正在使用Windows,则可以使用fflush()

3. Do not cast result of malloc因为它返回通用指针,并且可以使用out cast

进行分配