打印用 void 指针加载的 char 数组的值

print value of char array which is loaded with void pointer

我在下面的代码中将字符数组的地址传递给函数 "GetStr"。 GetStr 函数原型已修复。

在下面的代码中,我将字符串传递给函数 "GetStr" 的命令行参数,并更新变量 "str" 地址中的值。

问题: 在 Print 1 中,我得到了从命令行参数传递的值。主函数中的 Print 2,我无法打印或取回值。您能否让我知道如何在 "Print 2" 语句

处打印值
int GetStr(void *RetVal, int argc, char **argv)
{
    if(argc != 0){

        if(argv != NULL && argv[1] != '[=10=]'){
            RetVal = argv[1];
        }
        else{
            RetVal = '[=10=]';
        }
        cout<< " RetVal: " << (char *)RetVal <<endl; ->>>  PRINT 1
    }
    else{
        return -1;
    }
    return 0;
}

Driver:

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 = '[=10=]'; // 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 = '[=11=]';

相对于传递的数组没有影响。并且不清楚您在上面的第二个陈述中试图做什么。要么你想将指针设置为 NULL。或者您想将第一个指向的字节设置为无效的终止零字符,因为指针未取消引用并且类型为 void *.

而且似乎在 if 语句中不使用这个表达式

argv[1] != '[=12=]'

你的意思是

argv[1][0] != '[=13=]'

argv[1] != nullptr

无论如何这两个 if 语句

if(argc != 0){

    if(argv != NULL && argv[1] != '[=15=]'){

可以替代一个 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]指向的字符串所需的数组。