C返回字符串数组

时间:2015-11-01 06:33:34

标签: c arrays

我希望这个程序返回一个数组,然后是一个来自main的变量来从函数中获取这个数组,并且可以在代码的一部分中使用,该代码必须根据初始变量中的这些值来验证字符串。 但变量不能获得返回的数组。 我已经看过一些帖子说你不能用C语言返回数组,但是我也看过其他帖子,这是可能的。

但我想知道如何捕捉这个返回值。

int getUsers()
{
    char userVect[5][25];
    char user[24];
    int i = 0, j = 0, k;

    FILE  *usernames;
    usernames = fopen("usernames.cfg", "r");
    if (usernames == NULL){
        perror("usernames - err");
        return(-1);
    }

    while(fgets(user, sizeof(user), usernames) !=NULL){
        strcpy(userVect[j], user);
        j++;
    }

    fclose(usernames);
    for(k=0; k<j; k++)
        printf("Usernames are:  %s\n", userVect[k]);

    return userVect;
}

int main()
{
    printf("\nWelcome to Sys v1.24. To start off, please insert your command. \n");
    char *users;
    users = getUsers();
    printf("%c\n", users);

    return 0;
}

4 个答案:

答案 0 :(得分:6)

1。您想要return一个字符串,而您的函数的类型为int ??

我看到你返回一个2-d数组,那么你的函数应该是char **类型的颜色 ​​-

char **getUser(void)

2. 您从函数返回局部变量(userVect)。您无法在功能块外部访问它。

您应该在函数getUser -

中执行此操作
char **userVect;
userVect=malloc(5*sizeof(char **));              //allocate memory  
for(int i=0;i<5;i++)
   userVect[i]=malloc(25*sizeof(char));   

main执行此操作 -

char **user;
...
user=getUsers();                 // call function 

3。并在user中打印main -

for(int i=0;i<5;i++)
    printf("%s\n", user[i]);          //this is wrong in your code- printf("%c\n", users);

然后freemain然后结束 -

for(int i=0;i<5;i++)
    free(user[i]);
free(user);

答案 1 :(得分:2)

您正在返回堆栈变量。它在main()中无效。您应该在堆上分配它(使用malloc)或将其设置为全局变量(在这种情况下根本不需要返回它)。

答案 2 :(得分:0)

char ** getUsers(){
    char **userVect;
char user[24];
int i = 0, j = 0, k;

userVect=malloc(5*sizeof(char **));              //allocate memory  

for(int i=0;i<5;i++)
    userVect[i]=malloc(25*sizeof(char)); 

FILE  *usernames;
usernames = fopen("usernames.cfg", "r");
if (usernames == NULL){
    perror("usernames - err");
    return(-1);
}

    while(fgets(user, sizeof(user), usernames) !=NULL){
    strcpy(userVect[j], user);
    j++;
}

fclose(usernames);
for(k=0; k<j; k++)
    printf("Usernames are:  %s\n", userVect[k]);

return userVect;`

`int main(){ printf(“\ n欢迎来到Sys v1.24。首先,请插入您的命令。\ n”); char **用户;

users = getUsers();

for(int i = 0; i&lt; 5; i ++)     printf(“%s \ n”,user [i]);

返回0; }`

答案 3 :(得分:-6)

函数getUser()应返回char *

    #include<stdio.h>
    char userVect[5][25];
    char* getUsers(){ 
        char user[24];
        int i = 0, j = 0, k;

        FILE  *usernames;
        usernames = fopen("usernames.cfg", "r");
        if (usernames == NULL){
            perror("usernames - err");
            return(-1);
        }

        while(fgets(user, sizeof(user), usernames) !=NULL){
            strcpy(userVect[j], user);
            j++;
        }

        fclose(usernames);
        for(k=0; k<j; k++)
            printf("Usernames are:  %s\n", userVect[k]);

        return userVect;
    }

    int main(){
        printf("\nWelcome to Sys v1.24. To start off, please insert your command. \n");
        char *users;
        users = getUsers();
        printf("%c\n", users);

        return 0;
    }

你也可以在main()中声明userVect [5] [25]并将其作为参数传递给getUsers()函数。

你也可以在堆中获取数据(通过malloc),但对于像我这样的小数据集,我不推荐。

然后,主要原因是函数getUser()返回int。这将在32位系统上正确地给出输出,其中sizeof(int)== sizeof(ptr)。但在64位系统上,int的大小和ptr的大小是不同的。

您还需要考虑@ameyCU关于打印输出的第3点。