首页 > 解决方案 > 字符串列表 - 确定我哪里出错了

问题描述

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

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

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;

}

由于在输入字符串数后我找不到消除第一个 '\n' 的方法,因此我的输入示例如下:

3布鲁斯

德韦恩

for 循环中的 printf 函数用于在我输入这些字符串并将它们放入数组后检查它们是否在它们的位置。看起来不错。

但是,只要我添加一个简单的 for 循环来再次检查内容(在返回 0 之前;)

for(i=0;i<n;i++){
    printf("%s",A[i]);
}

只有姓氏被打印了三遍,这意味着其他人不在列表中(即使看起来他们是)。

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

标签: c

解决方案


A是指向 的指针char *,因此必须分配它来保存n指针:

A = malloc(n * sizeof(*A));

在阅读之后,stdin您必须以这种方式删除返回行:

a[strcspn(a, "\n")] = '\0';

然后 from 中的每个元素A都应该指向一个内存,我们在该内存上复制输入:

A[i] = malloc(strlen(a) + 1);

最后更改此分配A[i]=a,这将使 A指向的所有元素a,将字符串strncpy复制到:aA[i]

strncpy(A[i], a, strlen(a) + 1);

其他注意事项是,scanf它将留在要读取\n的缓冲区中,因此您必须在读取之前使用:fgets\nfgets

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

推荐阅读