我有下面的代码,我把数组的地址传递给函数 "GetStr"。GetStr函数的原型是固定的。
在下面的代码中,我将命令行参数(字符串)传递给函数 "GetStr",并更新变量 "str "地址中的值。
问题打印1时,我从命令行参数中得到了我所传递的值。在主函数中的打印2时,我无法打印或取回值。请你告诉我如何在 "Print 2 "语句中打印数值。
int GetStr(void *RetVal, int argc, char **argv)
{
if(argc != 0){
if(argv != NULL && argv[1] != '\0'){
RetVal = argv[1];
}
else{
RetVal = '\0';
}
cout<< " RetVal: " << (char *)RetVal <<endl; ->>> PRINT 1
}
else{
return -1;
}
return 0;
}
驱动程序。
int main(int argc, char **argv)
{
char str[8];
GetStr(str,argc,argv);
cout<<"HH: "<<((char *)(str))<<endl; ->>> PRINT 2
}
你必须使用 strcpy()
来复制一个字符串。你只是把地址分配给了 argv[1]
到本地变量 RetVal
,它对调用器中的数组没有影响。
你还应该检查 argc
以确定 argv[1]
已经提供。
int GetStr(void *RetVal, int argc, char **argv)
{
if(argc != 0){
if(argv != NULL && argc >= 2){
strcpy((char*)RetVal, argv[1]); // copy first argument
}
else{
*(char*)RetVal = '\0'; // Set to empty string
}
cout<< " RetVal: " << (char *)RetVal <<endl; ->>> PRINT 1
}
else{
return -1;
}
return 0;
}
需要注意的是,必须投下 RetVal
在赋值中通过它间接引用之前,因为你不能对一个 void
指针。
参数 RetVal
是函数的局部变量 GetStr
. 它的改变不会影响传递给函数的原始参数。此外,由于原始参数是一个数组,那么数组没有赋值操作符。你必须复制由 argv[1]
到传递的数组中。
所以在任何情况下,这条语句
RetVal = argv[1];
而这
RetVal = '\0';
相对于传递的数组没有任何影响。而且不清楚你在上面第二条语句中想做什么。要么你想将指针设置为NULL。或者你想将第一个指向的字节设置为终止的零字符,这是无效的,因为指针没有被取消引用,而且其类型是 void *
.
此外,似乎在if语句中没有这个表达式
argv[1] != '\0'
你是说
argv[1][0] != '\0'
或
argv[1] != nullptr
在任何情况下,这两个if语句
if(argc != 0){
if(argv != NULL && argv[1] != '\0'){
可以用一个if语句代替
if ( not ( argc < 2 ) )
该函数至少可以是以下方式
int GetStr( void *RetVal, int argc, char **argv )
{
int error = argc < 2 ? -1 : 0;
if ( not error )
{
strcpy( RetVal, argv[1] );
}
return error;
}
该函数除了用于调试目的外,不应该输出任何信息。该函数的调用者将决定是否输出任何信息。
要注意的是,这个函数是不安全的,因为传递的数组可能小于复制由 argv[1]
.