打印用 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]
指向的字符串所需的数组。
我在下面的代码中将字符数组的地址传递给函数 "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]
指向的字符串所需的数组。