Передать массив строк по ссылке в c - PullRequest
1 голос
/ 20 июля 2011

Я хочу обработать массив строк Arg [10] [50], используя функцию strtoArg (), Должно быть возвращено два значения, одно из которых является переменной 'ArgNo', которая является Numbers of 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 Ответ

1 голос
/ 20 июля 2011

Я изменил ваш код, см. Следующее:

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

Подводные камни в вашем коде:

  1. ArgNum = strtoArg(Instr,*Arg); в main(). То, что *Arg не означает адрес двумерного массива.
  2. int strtoArg (IN char* instr, OUT char &arg). &arg - это ссылка на C ++, это означает, что вы будете изменять переменную в вызывающей стороне при вызове функции. Однако то, что вы передаете, является просто именем массива, и нет необходимости менять значение для себя.
  3. arg = &temp[ArgNo]; кажется, что вы хотите "вернуть" локальный массив, к сожалению, вы не должны этого делать. Вы не можете вернуть любые локальные данные, которые хранятся в стеке, потому что они будут повреждены после возврата функции.

В сторону: параметр char arg[][50], arg означает «указатель на массив char [50]», когда arg++ переходит к «следующей строке» Arg[10][50]. Хммм, хотя это может соответствовать вашим потребностям, может быть, ему не хватает гибкости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...