字符串列表 - 确定我出错的地方

时间:2018-05-06 15:14:46

标签: c

这是我需要在算法和数据结构中解决的问题的一部分,但我无法超越这一点。

第一步是加载一串字符串并使用双指针将它们放入数组中。似乎很清楚。我的初始代码是:

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

只有姓氏被打印三次,这意味着其他人不是列表的一部分(即使它们看起来像是这样)。

我想知道是否有人能看到我哪里出错了,我真的很感激。

2 个答案:

答案 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指向astrncpya字符串复制到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);

并且不要忘记检查scanffgets的返回值是否有错误情况:

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

完成后不要忘记释放记忆。