我希望这个程序返回一个数组,然后是一个来自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;
}
答案 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);
然后free
在main
然后结束 -
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)
#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点。