【问题标题】:Insert strings in array of string在字符串数组中插入字符串
【发布时间】:2015-04-14 15:33:43
【问题描述】:

我必须在 C 中的字符串数组中插入字符串。我写了一个函数,但它不起作用。你能帮帮我吗?

当我要打印数组时,程序崩溃了。

谢谢

int leggi(char **a, int *len) {
    int i;
    scanf("%d", len);
    if(*len <= 0) return 1;

    a = (char **) malloc(*len * sizeof(char *));
    if(a == NULL) return 1;

    for( i = 0; i < *len; i++ ) 
    {
        a[i]=(char *)malloc(101*sizeof(char));
        scanf("%s", &a[i]);
    }
    printf("Saved\n");
    return 0;
}

int main() {

    int i, n;
    char **A;

    if(leggi(A, &n)) return 1;
    printf("%d\n",n);




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

【问题讨论】:

  • printf("%s\n", &amp;A[i]); 应该是printf("%s\n", A[i]);
  • “没用”是什么意思?你发现了什么问题?
  • 永远不要强制转换 malloc() 的结果。
  • 必须强制转换 malloc()!它返回一个 void* 但我有 char* 和 char**!
  • "malloc() 必须强制转换":不,在 C 中这不是必需的:stackoverflow.com/q/605845/694576

标签: c arrays string algorithm malloc


【解决方案1】:

scanf("%s", &amp;a[i]) 更改为scanf("%s", a[i]),a[i] 是指向字符串中第一个字符的指针,获取它的地址只会返回指针的地址,而不是实际的第一个字符。需要注意的另一件事是,您实际上并没有修改主函数中的指针,而只是修改了本地函数指针,因此,它对 main 中的指针没有影响。 这是修改后的版本:

int read(char ***a, int *len) {
    int i;
    scanf("%d", len);
    if( *len <= 0 ) return 1;

    (*a) = (char **) malloc(*len * sizeof(char *));
    if((*a) == NULL) return 1;

    for( i = 0; i < *len; i++ )
    {
        (*a)[i]=(char *)malloc(101*sizeof(char));
        scanf("%s", (*a)[i]);
    }
    printf("Saved\n");
    return 0;
}

int main() {

    int i, n;
    char **A;

    if(read(&A, &n)) return 1;
    printf("%d\n",n);

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

【讨论】:

  • -1 因为:这个建议的答案仍然存在原始发布代码的大部分问题。 1) 从 malloc 转换返回的调用 2) 命名子例程 'read()' 3) 使用 'sizeof(char)' 注意:sizeof(char*) 是可以的。 4) 在scanf() 中使用“%s”作为格式转换参数意味着没有大小限制,因此用户可以输入足够的字符来溢出输入缓冲区。 5) 未检查 scanf() 的返回值以确保输入/转换成功...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-19
  • 2020-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多