C-读取并分配任意字符串数组

C-读取并分配任意字符串数组,c,c89,C,C89,我对读取输入中给定字符串数组的非常简单的函数感到恼火。 我还知道如何读取字符串并将其放入数组中,而无需编写适当的函数(在main()中编写所有内容)。 这就是我正在使用的示例 我认为主要的障碍是正确使用三星指针 #include <stdio.h> #include <stdlib.h> int read(char ***a, int *len){ scanf("%d", len); if(*len <= 0) return 1; *a

我对读取输入中给定字符串数组的非常简单的函数感到恼火。 我还知道如何读取字符串并将其放入数组中,而无需编写适当的函数(在main()中编写所有内容)。 这就是我正在使用的示例

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

#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;
}
#包括
#包括
整数读取(字符***a,整数*len){
scanf(“%d”,len);

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

#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;
}
#包括
#包括
整数读取(字符***a,整数*len)
{
scanf(“%d”,len);

if(*len啊,一个三星级程序员!为什么?这有什么不好?使用
***
通常不被认为是最干净的设计,特别是来自一个绝对的初学者。如果你创建局部变量(
char**local;int local_len;
),事情就不会那么混乱了然后,在函数退出之前,分配它们:`*a=local\u a;*len=local\u len;消除
***
的一种方法是让函数返回一个数组:
char**read(int*len){…}
你复制粘贴的bug!@freestyle你在说什么?@H.S.那不是bug,我故意把它放在那里让OP注意到对malloc()的两个调用之间的差异@machine_1:我没有指出这是一个bug,只是一个建议。@freestyle真的吗?你是认真的吗?如果OP想防止缓冲区溢出,那是他的工作。我的答案在问题正文中解决了这个问题。