这是我需要在算法和数据结构中解决的问题的一部分,但我无法超越这一点。
第一步是加载一串字符串并使用双指针将它们放入数组中。似乎很清楚。我的初始代码是:
int main (void){
char **A, a[50];
int n,i;
scanf("%d",&n);
A=malloc(n*sizeof(a));
for(i=0;i<n;i++){
fgets(a,sizeof(a),stdin);
a[sizeof(a)-1]='\0';
A[i]=a;
printf("%s",A[i]);
}
return 0;
}
因为我无法找到消除第一个&#39; \ n&#39;输入字符串数后,我输入的一个例子是:
3Bruce
简
德韦恩
在我输入并将它们放入数组后,for循环中的printf函数用于检查这些字符串是否在它们的位置。看起来很好。
然而,只要我添加一个简单的for循环来再次检查内容(在返回0之前);
for(i=0;i<n;i++){
printf("%s",A[i]);
}
只有姓氏被打印三次,这意味着其他人不是列表的一部分(即使它们看起来像是这样)。
我想知道是否有人能看到我哪里出错了,我真的很感激。
答案 0 :(得分:4)
A
是指向char *
的指针,因此必须分配它来保存n
指针:
A = malloc(n * sizeof(*A));
从stdin
阅读后,您必须以这种方式删除返回行:
a[strcspn(a, "\n")] = '\0';
然后A
中的每个元素都应指向一个内存,我们在其上复制输入:
A[i] = malloc(strlen(a) + 1);
最后更改此作业A[i]=a
,它将生成所有元素
A
指向a
,strncpy
将a
字符串复制到A[i]
:
strncpy(A[i], a, strlen(a) + 1);
其他注意事项是scanf
会将\n
留在fgets
将要读取的缓冲区中,因此在阅读\n
之前必须使用fgets
{1}}:
int c;
do {
c = getchar();
} while(c != '\n' && c != EOF);
并且不要忘记检查scanf
和fgets
的返回值是否有错误情况:
if (scanf("%d",&n) != 1) {
fprintf(stderr, "Error while reading n\n");
return 1;
}
...
if (fgets(a,sizeof(a),stdin) != NULL) {
fprintf(stderr, "Error while reading input\n");
return 1;
}
最后不要忘记free
已分配的内存:
for (int i = 0; i < n; i++) {
free(A[i]);
}
free(A);
答案 1 :(得分:1)
您的for循环始终将输入字符串存储到数组a
中,并将相同的地址存储到A[i]
的每个元素中。
我对您的计划进行了一些更正:
int main (void){
char **A, a[50];
int n,i;
scanf("%d",&n);
A=malloc(n*sizeof(char *));
for(i=0;i<n;i++){
fgets(a,sizeof(a),stdin);
A[i]=malloc(strlen(a)+1);
strcpy(A[i],a);
}
return 0;
}
完成后不要忘记释放记忆。