使用预定义指向字符串的指针初始化指针数组?

时间:2018-04-04 13:10:01

标签: c arrays pointers

如何使用预定义指向字符串的指针初始化指针数组。请有人帮助我,并向我解释其背后的逻辑。提前谢谢,感谢您的帮助。

char *str1 = NULL, *str2 = NULL, *str3 = NULL ;
char *array[n]={str1, str2, str3};
int n=3;
printf("\n\t\t\t *** Zeile als Zeichenkette einlesen *** \n");
for(int i=0;i<n ;i++) {
    printf("Die eingelesene Zeichenkette ist : %s \n", array[i] [0]=zeichenketteEinlesen());
    printf("test %s \n",str1);
    free(str1);
}

这是我的整个计划

char* zeichenketteEinlesen(void){
    int i=0;
    char c ;
    char *Z_Kette = NULL ;
    Z_Kette = (char*)malloc(sizeof(char)) ;
    if(NULL == Z_Kette) {
        printf("Kein virtueller RAM mehr verfuegbar ...\n");
        return EXIT_FAILURE;
    }
    printf("Geben Sie Die Zeichenkette ein bitte ! :");
    while ( (c = getchar()) != '\n' ){
         Z_Kette=(char*)realloc(Z_Kette, (i+2)*sizeof(char));
            if(NULL == Z_Kette) {
                printf("Kein virtueller RAM mehr verfuegbar ...\n");
                    return EXIT_FAILURE;
            }
            Z_Kette [i++] = (char)c ;
    }
    Z_Kette[i] = '\0' ;
    return Z_Kette ;
}
int main()
{
    char *str1 = NULL, *str2 = NULL, *str3 = NULL ;
    char *array[n]={str1, str2, str3};
    int n=3;
    printf("\n\t\t\t *** Zeile als Zeichenkette einlesen *** \n");
    for(int i=0;i<n ;i++) {
        printf("Die eingelesene Zeichenkette ist : %s \n", array[i][0]=zeichenketteEinlesen());
        printf("test %s \n",str1);
        free(str1);
    }
    getchar();
    return 0;
}

1 个答案:

答案 0 :(得分:0)

char *str1 = NULL, *str2 = NULL, *str3 = NULL ;
char *array[n]={str1, str2, str3};
int n=3;
  1. 您应该使用常量初始化数组,例如3,而不是变量。
  2. 以这种方式定义数组在语法上是可以的,尽管它在逻辑上是不正确的。
  3. 下面是我的代码(我重构了格式以便更好看):

    #include <stdio.h>
    #include <stdlib.h>
    
    char* zeichenketteEinlesen(void){
        int i=0;
        char c ;
        char *Z_Kette = NULL ;
        Z_Kette = (char*)malloc(sizeof(char)) ;
        if(NULL == Z_Kette) {
            printf("Kein virtueller RAM mehr verfuegbar ...\n");
            // incompatible return type
            exit(EXIT_FAILURE);
        }
        printf("Geben Sie Die Zeichenkette ein bitte ! :");
        while ( (c = getchar()) != '\n' ){
            Z_Kette=(char*)realloc(Z_Kette, (i+2)*sizeof(char));
            if(NULL == Z_Kette) {
                printf("Kein virtueller RAM mehr verfuegbar ...\n");
                // incompatible return type too
                exit(EXIT_FAILURE);
            }
            Z_Kette [i++] = (char)c ;
        }
        Z_Kette[i] = '\0' ;
        return Z_Kette ;
    }
    
    int main() {
        char *str1 = NULL, *str2 = NULL, *str3 = NULL ;
        // logic error, what you want is to change strx, while in your way it changes array elements.
        char **array[3]={&str1, &str2, &str3};
        int n=3;
        printf("\n\t\t\t *** Zeile als Zeichenkette einlesen *** \n");
        for(int i=0;i<n ;i++){
            // you should not use array[i][0], since array[i] is not an array
            printf("Die eingelesene Zeichenkette ist : %s \n", *(array[i])=zeichenketteEinlesen());
            // here, you should use / free an appropriate pointer in every loop cycle.
            // (but below is not a good way to do this, you can improve it)
            if (i == 0) {
                printf("test %s \n",str1);
                free(str1);
            } else if (i == 1) {
                printf("test %s \n",str2);
                free(str2);
            } else {
                printf("test %s \n",str3);
                free(str3);
            }
        }
        getchar();
        return 0;
    }