字符串的动态内存分配 int ReadNames(字符***名称,int*n) { int i,k; 字符名[100]; printf(“输入名称的数量\n”); scanf(“%d”,n); /*分配内存和读取名称*/ *name=(char**)malloc((*n)*sizeof(char*); 对于(i=0;i

字符串的动态内存分配 int ReadNames(字符***名称,int*n) { int i,k; 字符名[100]; printf(“输入名称的数量\n”); scanf(“%d”,n); /*分配内存和读取名称*/ *name=(char**)malloc((*n)*sizeof(char*); 对于(i=0;i,c,string,pointers,malloc,gets,C,String,Pointers,Malloc,Gets,只需在scanf()之后添加getchar() 这样每个'\n'在接受输入时都会被处理掉。 您的代码将被删除 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 **)

只需在
scanf()之后添加
getchar()

这样每个
'\n'
在接受输入时都会被处理掉。 您的代码将被删除

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);
}
int ReadNames(字符***名称,int*n)
{
int i,k;
字符名[100];
printf(“输入名称的数量\n”);
scanf(“%d”,n);
getchar();//在缓冲区中吃不必要的“\n”
/*分配内存和读取名称*/
*name=(char**)malloc((*n)*sizeof(char*);
对于(i=0;i只需在
scanf()之后添加
getchar()

这样每个
'\n'
在接受输入时都会被处理掉。 您的代码将被删除

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);
}
int ReadNames(字符***名称,int*n)
{
int i,k;
字符名[100];
printf(“输入名称的数量\n”);
scanf(“%d”,n);
getchar();//在缓冲区中吃不必要的“\n”
/*分配内存和读取名称*/
*name=(char**)malloc((*n)*sizeof(char*);

对于(i=0;i您遇到的问题很可能是因为用于获取计数的
scanf
使换行符仍保留在缓冲区中。这意味着第一个
get
调用读取该换行符,然后添加该空行

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

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);
}

您遇到的问题很可能是因为用于获取计数的
scanf
将换行保留在缓冲区中。这意味着第一个
get
调用读取该换行,然后添加该空行

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

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.请不要使用
gets()
而是使用
fgets()

scanf("%d ", n);
删除输入末尾的换行符

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

没有几个简单的解决办法

使用
getchar()
读取
scanf()之后的换行符

scanf()中的
%d
之后添加空格

如果您在windows上工作,可以使用
fflush()


3.因为它返回泛型指针,并且可以使用out cast赋值。请不要使用
gets()
而是使用
fgets()

scanf("%d ", n);
删除输入末尾的换行符

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

没有几个简单的解决办法

使用
getchar()
读取
scanf()之后的换行符

scanf()中的
%d
之后添加空格

如果您在windows上工作,可以使用
fflush()

3.因为它返回泛型指针,并且可以在不强制转换的情况下分配它四件事:首先,不要强制转换
malloc
的返回。其次,为什么不使用简单的数组索引而不是指针算术(比如
(*Names)[i]
)第三,不需要临时的
name
变量。第四,永远不要使用
get
,而是使用
fgets
。四件事:首先,不要使用
malloc
的返回。第二,为什么不使用简单的数组索引而不是指针算术(比如
(*Names)[i]
)第三,不需要临时的
name
变量。第四,永远不要使用
get
,而是使用
fgets