2011-07-20 8 views
1

関数strtoArg()を使用して文字列Arg [10] [50]の配列を進めたいと思います。 2つの値を返すはずです。変数 'ArgNo'はArg (値渡し)& other args配列変数 '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; 
} 

、この道を行くしようとしています。 私は正しい道にいるのですか?

+0

C++ ism ... C++にタグする必要がありますか? – ShinTakezou

答えて

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; 
} 

落とし穴があります:main()

  1. ArgNum = strtoArg(Instr,*Arg);。その*Argは、2D配列のアドレスを意味するものではありません。
  2. int strtoArg (IN char* instr, OUT char &arg)&argはC++のリファレンスです。つまり、関数を呼び出すときに呼び出し元の変数を変更することを意味します。しかし、渡すものは単なる配列名であり、値自体を変更する必要はありません。
  3. arg = &temp[ArgNo];ローカルアレイを「返す」ように思えますが、残念ながら、これを行うべきではありません。スタックに格納されているローカルデータは返すことができません。これは、関数が返された後に破損する可能性があるためです。別に

:パラメータchar arg[][50]arg手段「チャー[50]配列へのポインタ」、それはArg[10][50]の「次の行」に進むarg++。うーん、それはあなたの必要性に合っているかもしれませんが、おそらく柔軟性に欠けています。

+0

ありがとうStanあなたのソリューションコードが動作します!!!!! しかし、私が変えなければならないことは、 のスタンドで 'strcpy(arg、pch);' 'strcpy(* arg、pch);' これは完璧に動作します!!!!!!!!! 理由を教えてください。 –

+0

@Heet Kansagra:私のコードは自分のコンピュータで正常に動作します。実際、この関数は 'int strtoArg(IN char * instr、OUT char(* arg)[50])'と書くことができます。つまり、argはchar [50]配列へのポインタと考えることができます。しかし、C言語では、配列のアドレスが混沌とした意味を持っているので、次のようにすることができます: 'int main(){char Arg [3] [2] = {1,2,3,4,5,6}; char(* p)[50] = Arg; printf( "p =%x \ n"、p + 1); printf( "* p =%x \ n"、*(p + 1)); return 0;} '。驚いたことに、出力は同じになります。簡単に言えば、 '&Arg'と' Arg'は値が同じです(型は異なりますが)。 – Stan

+0

あなたが説明しているように、argは関数宣言時またはその中に文字列をコピーするときのポインタでなければなりません。はい、Argと&Argは同じですが、ポインタとして宣言した場合に限ります。ところでおかげさまで... !! –

関連する問題