在c中通过引用传递String数组

时间:2011-07-20 06:33:58

标签: c

我想使用函数strtoArg()继续一个字符串Arg [10] [50]的数组, 它应该返回两个值,一个是变量'ArgNo',它是Arg的数字(将通过值)&另一个是Arguments数组变量'arg'(将通过引用传递)。 帮我解决这个问题,如何从函数中获得正确的Arg值 提前谢谢。

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#define IN 
#define OUT


int strtoArg (IN char* instr, OUT char &arg)
{

char *pch,temp[10][50];
    int ArgNo=0,j;  

    pch = strtok (instr," -");
    while (pch != NULL){
        strcpy((char*)(temp[ArgNo]),pch);
        arg = &temp[ArgNo]; 
        pch = strtok (NULL, " -");
        ArgNo++;    
    }
    return ArgNo;
}


int main()

{

    char Instr[50],Arg[10][50];
    int ArgNum,i;

    gets(Instr);

    ArgNum = strtoArg(Instr,*Arg);

    for(i=1; i<ArgNum; ++i)
        printf("%s",Arg[i]);        

    return 0;
}

我试着这样做,

int strtoArg (IN char* instr, OUT char* arg)
{    
    char *pch;
    int ArgNo=0,j;  

    pch = strtok (instr," -");
    while (pch != NULL){
        strcpy((char*)arg[ArgNo],pch);
        pch = strtok (NULL, " -");
        ArgNo++;    
    }
    return ArgNo;    
}

int main()
{       
    char Instr[50],Arg[10][50];     
    int ArgNum,i;    
    gets(Instr);

    ArgNum = strtoArg(Instr,*Arg);

    printf("here"); 

    for(i=1; i<ArgNum; ++i)
        printf("%s",Arg[i]);        

    return 0;
}

删除错误但会产生分段错误。 我在正确的道路上吗?

1 个答案:

答案 0 :(得分:1)

我修改了您的代码,请参阅以下内容:

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#define IN
#define OUT


int strtoArg (IN char* instr, OUT char arg[][50])
{
    char *pch;
    int ArgNo=0,j;

    pch = strtok (instr," -");
    while (pch != NULL){
        strcpy(arg,pch);
        arg++;
        pch = strtok (NULL, " -");
        ArgNo++;
    }
    return ArgNo;
}


int main()
{

    char Instr[50],Arg[10][50];
    int ArgNum,i;

    gets(Instr);

    ArgNum = strtoArg(Instr, Arg);

    for(i=1; i<ArgNum; ++i)
        printf("%s\n",Arg[i]);

    return 0;
}

代码中的陷阱是:

    ArgNum = strtoArg(Instr,*Arg);
  1. main()*Arg并不意味着2D数组的地址。
  2. int strtoArg (IN char* instr, OUT char &arg)&arg是C ++中的引用,它意味着您将在调用函数时修改调用者中的变量。但是,您传递的只是一个数组名称,并且没有必要为自己更改值。
  3. arg = &temp[ArgNo];似乎你想“返回”一个本地数组,不幸的是,你不应该这样做。您不能返回存储在堆栈中的任何本地数据,因为它会在函数返回后被破坏。
  4. 除此之外:参数char arg[][50]arg表示'指向char [50]数组'的指针,当arg++转到Arg[10][50]的“下一行”时}。嗯,虽然它可能适合你的需要,但也许缺乏灵活性。