如何解决如何从没有结构的函数中获取多个变量?
我正在为我在大学期间完成的一项任务编写代码,我已经编写了大部分代码,但我刚刚意识到我的核心功能中的某些内容没有像我希望的那样工作。我多次尝试对其进行故障排除,但我不明白为什么 char
变量在运行结束时被删除,而 int
变量保持不变。
void Analyze()
{
char buffer[81];
char* ptr;
char* ptr2;
ptr = 0;
fgets(buffer,sizeof buffer,stdin);
printf("%s\n",buffer);
char* command = strtok_s(buffer," \t",&ptr);
printf_s("the command you selcted is %s\n",command);
char* Matname = strtok_s(NULL,&ptr);
printf_s("the name you selcted is %s\n",Matname);
char* row1 = strtok_s(NULL," \t",&ptr);
printf_s("the rowsize you selcted is %s\n",row1);
char* col1 = strtok_s(NULL,&ptr);
printf_s("the colsize you selcted is %s\n",col1);
row = strtol(row1,&ptr2,10);
col = strtol(col1,10);
// *command = command;
// *Matname = Matname;
printf_s("row number is %d,col number is %d",row,col);
return ;
}
我需要获得 command
名称和 Matname
以便之后我不知道如何将其分配给矩阵。现在由于某种原因,我只得到了 row 和 col,我可以用它构建一个矩阵。
就像我说的,这是我项目中的主要功能,最终所有的文本都不会用于调试,我似乎不知道为什么command
和Matname
正在被删除。
解决方法
调用者应该提供缓冲区来接收字符串,将缓冲区传递给函数,因此:
void Analyse( char* cmd_buffer,size__t cmd_len,char* matname_buffer,size_t matname_len ) ;
int main()
{
char* command[81] = {0} ;
char* matname[81] = {0} ;
Analyse( command,sizeof(command) - 1,matname,sizeof(matname) - 1 ) ;
}
void Analyse( char* cmd_buffer,size_t matname_len )
{
...
strncpy( cmd_buffer,command,cmd_len ) ;
strncpy( matname_buffer,Matname,matname_len ) ;
return ;
}
,
在 C 中,函数不能返回多个值。您基本上有两个选择:
- 将缓冲区传递给函数,用相关数据填充提供的缓冲区(请参阅 Clifford 的回答)。
- 在函数中分配缓冲区并返回指向所述缓冲区的指针。
对于后者,你可以这样做:
void foo(char **p_cmd_buffer,char ** p_matname_buffer){
...
*p_cmd_buffer = malloc(cmd_buffer_required_size);
if(p_cmd_buffer != NULL){
//copy your data to the buffer
}
*p_matname_buffer = malloc(cmd_buffer_required_size);
if(p_matname_buffer != NULL){
//copy your data to the buffer
}
...
}
int main(void){enter code here
...
char *cmd,*matname;
foo(&cmd,&matname);
...
}
或者,您可以将数据包装在一个结构中,在您的函数中分配一个,填充它并返回一个指向它的指针:
struct wrapper_struct{
char *matname;
char *cmd;
}
struct wrapper_struct* foo(void){
...
struct wrapper_struct* ret = malloc(sizeof(struct wrapper_struct));
if(ret != NULL){
ret->cmd = malloc(cmd_buffer_required_size);
if(ret->cmd != NULL){
//copy your data to the buffer
}
ret->matname = malloc(matname_buffer_required_size);
if(ret->matname){
//copy your data to the buffer
}
}
}
int main(void){
...
wrapper_struct* data = foo();
...
}
这仅在调用函数不知道缓冲区必须有多大时才真正有用。在您的情况下,大小是已知的(每个字符串 81 个字符)。
缺点:
- 调用函数可能不知道内存是如何分配的。您必须提供其他功能才能再次释放数据。
- 您必须处理分配内存的潜在失败
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。