字符串的动态内存分配 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
。