【问题标题】:C - Read and allocate an arbitrary array of stringsC - 读取和分配任意字符串数组
【发布时间】:2018-03-21 18:39:22
【问题描述】:

我对一个非常简单的函数很生气,它可以读取输入中给出的字符串数组。 我也知道如何读取字符串并将它们放入数组中,而无需编写适当的函数(在 main() 中写入所有内容)。 这是我正在使用的示例。

我认为主要的障碍是正确使用 3 星指针。

#include <stdio.h>
#include <stdlib.h>

int read(char ***a, int *len){
    scanf("%d", len);

    if(*len <= 0) return 1;

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

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

int main(){
    int len, i;
    char **A;
    // read an array of strings
    if( read(&A, &len)) return 1;

    // DO SOMETHING

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

    return 0;
}

【问题讨论】:

  • 啊,三星级程序员!
  • 为什么?这有什么不好?
  • 使用*** 通常不被认为是最简洁的设计,尤其是对于绝对初学者而言。
  • 如果您创建局部变量 (char **local_a; int local_len;) 并在整个函数中使用它们,事情就会变得不那么混乱。然后,在函数退出之前,分配它们:`*a = local_a; *len = local_len;
  • 消除*** 的一种方法是让函数返回一个数组:char ** read(int *len) {...}

标签: c c89


【解决方案1】:

您需要注意两件事:运算符优先级和间接级别。如果您不知道哪个运算符的优先级高于另一个,请将您的变量括在括号中:

#include <stdio.h>
#include <stdlib.h>

int read(char ***a, int *len)
{
    scanf("%d", len);

    if (*len <= 0) return 1;

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

    for (int i = 0; i<*len; i++) {
        (*a)[i] = (char *)malloc(101 * sizeof(char)); // note this line
        scanf("%s", (*a)[i]);
    }
    return 0;
}

int main()
{
    int len, i;
    char **A;
    // read an array of strings
    if (read(&A, &len)) return 1;

    // DO SOMETHING

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

    //system("PAUSE");
    return 0;
}

【讨论】:

  • 你复制粘贴的错误!
  • @freestyle 你在说什么?
  • @H.S.这不是一个错误,我故意把它留在那里让 OP 注意到两次调用 malloc() 之间的区别。
  • @machine_1:我没有指出它是一个错误,而只是一个建议。
  • @freestyle 真的吗?你是认真的吗?如果 OP 想要防止缓冲区溢出,那就是他的工作。我的回答解决了问题正文中的问题。
猜你喜欢
  • 2016-01-23
  • 1970-01-01
  • 1970-01-01
  • 2017-02-16
  • 1970-01-01
  • 2011-02-07
  • 1970-01-01
  • 1970-01-01
  • 2012-02-19
相关资源
最近更新 更多