Simple question with array of strings

Discussion in 'C++' started by Rafi Kfir, Nov 2, 2004.

  1. Rafi Kfir

    Rafi Kfir Guest

    Hi,

    This may look as a smiple task to most of you, but to me (a beginner
    with C), it drives me crazy.

    All I want is that one function passes a two dimensional array of
    strings to another function.

    example:
    NOTE: the strings can be of different length and the array will be
    initialized many times to differnt values.

    void fun_1()
    {
    char **Arr[3][2]= {'\0'}; //I want to define a 3x2 array of strings
    of
    //different length (max 32 ch)
    //Arr initialization
    // Arr ["ONE", "1"]
    // ["Two", "2"]
    // ["THREE", "3"]

    fun2(Arr);
    }

    void fun_2(char **rcvArr)
    {

    }

    CAn anybody help me with how to define it, how to initialize it and
    hwo to send and receive it as a parameter.

    I suspect that I must define some buffer length. The question is
    should I select fixed length (e.g. 32 ch per string) or a veriable
    length. In the other option I would probably need to use malloc in
    order to allocate memory...

    I would be happy to be advised of the best way to do it. Also, when I
    initialize the array, I preffer that it will take as little text space
    as possible (for example, the best will be to define it all in one
    line!).

    Thanks for helping
    Rafi
     
    Rafi Kfir, Nov 2, 2004
    #1
    1. Advertising

  2. Rafi Kfir

    Tim Love Guest

    (Rafi Kfir) writes:

    >Hi,


    >This may look as a smiple task to most of you, but to me (a beginner
    >with C), it drives me crazy.


    >All I want is that one function passes a two dimensional array of
    >strings to another function.
    > ...


    >I would be happy to be advised of the best way to do it.

    Look up <vector> and <string> in a C++ book - or online.
     
    Tim Love, Nov 2, 2004
    #2
    1. Advertising

  3. Rafi Kfir wrote:
    > This may look as a smiple task to most of you, but to me (a beginner
    > with C), it drives me crazy.


    If you need help with C, you should consider comp.lang.c as your NG of
    choice.

    > All I want is that one function passes a two dimensional array of
    > strings to another function.
    >
    > example:
    > NOTE: the strings can be of different length and the array will be
    > initialized many times to differnt values.
    >
    > void fun_1()
    > {
    > char **Arr[3][2]= {'\0'}; //I want to define a 3x2 array of strings
    > of
    > //different length (max 32 ch)


    In C++ one should always consider standard containers for that:

    vector<vector<string> > Arr;

    In C you probably will want to declare an array of pointers to char:

    char *Arr[3][2] = { 0 };

    and then somehow allocate the memory. Although, I'd susupect that to
    have an array of 33-char arrays would be easier (since you limited your
    strings to 32 bytes):

    char Arr[3][2][33];

    > //Arr initialization
    > // Arr ["ONE", "1"]
    > // ["Two", "2"]
    > // ["THREE", "3"]


    If you declare your array as 3-dimensional, you still should be able to
    initialise it as

    char Arr[3][2][33] =
    { { "ONE", "1" }, { "Two", "2" }, { "Three", "3" } };

    >
    > fun2(Arr);
    > }
    >
    > void fun_2(char **rcvArr)


    Just repeat the declaration of the Arr in your function declaration (but
    pick the right name for it first, 'fun2' or 'fun_2'):

    void funX(char Arr[3][2][33])

    > {
    >
    > }
    >
    > CAn anybody help me with how to define it, how to initialize it and
    > hwo to send and receive it as a parameter.


    How about a book on C? Do you have any?

    > I suspect that I must define some buffer length. The question is
    > should I select fixed length (e.g. 32 ch per string) or a veriable
    > length. In the other option I would probably need to use malloc in
    > order to allocate memory...


    Right.

    > I would be happy to be advised of the best way to do it.


    There is no "best" way to skin the proverbial cat. There is always more
    than one way and each has its advantages and drawbacks.

    > Also, when I
    > initialize the array, I preffer that it will take as little text space
    > as possible (for example, the best will be to define it all in one
    > line!).


    Yes, you could do that too if your array doesn't change. But it's usually
    a maintenance nightmare.

    const char arr_[] = "ONE\01\0Two\02\0THREE\03\0";
    /* ^0 ^4 ^6 ^10^12 ^18
    const char* const Arr[3][2] =
    {{ arr_, arr_+ 4 }, { arr_+ 6, arr_+ 10 }, { arr_+12, arr_+18 }};

    V
     
    Victor Bazarov, Nov 2, 2004
    #3
  4. "Rafi Kfir" <> wrote in message
    news:...
    > Hi,
    >
    > This may look as a smiple task to most of you, but to me (a beginner
    > with C), it drives me crazy.


    news:comp.lang.c if you really are interested in C and not C++.

    >
    > All I want is that one function passes a two dimensional array of
    > strings to another function.


    It's impossible to pass arrays in C or C++. You have to use pointers
    instead. This is one reason (among many) to use vectors instead of arrays in
    C++.

    >
    > example:
    > NOTE: the strings can be of different length and the array will be
    > initialized many times to differnt values.
    >
    > void fun_1()
    > {
    > char **Arr[3][2]= {'\0'}; //I want to define a 3x2 array of strings


    char* Arr[3][2] = { { "ONE", "1" }, { "TWO", "2" }, { "THREE", "3" } };

    > of
    > //different length (max 32 ch)
    > //Arr initialization
    > // Arr ["ONE", "1"]
    > // ["Two", "2"]
    > // ["THREE", "3"]
    >
    > fun2(Arr);
    > }
    >
    > void fun_2(char **rcvArr)


    void fun_2(char* (*rcvArr)[2])

    Horrible.

    > {
    >
    > }
    >
    > CAn anybody help me with how to define it, how to initialize it and
    > hwo to send and receive it as a parameter.
    >
    > I suspect that I must define some buffer length. The question is
    > should I select fixed length (e.g. 32 ch per string) or a veriable
    > length. In the other option I would probably need to use malloc in
    > order to allocate memory...


    Yes, you are right.

    >
    > I would be happy to be advised of the best way to do it. Also, when I
    > initialize the array, I preffer that it will take as little text space
    > as possible (for example, the best will be to define it all in one
    > line!).


    Decide what you are programming, C or C++. Post to the appropriate
    newsgroup.

    If you are programming C then you have to do something like the rubbish
    above.

    If you are programming C++, then you can use vector and string and forget
    about the rubbish above.

    #include <vector>
    #include <string>
    using namespace std;

    struct StringPair
    {
    StringPair(string f, string s)
    {
    first = f;
    second = s;
    }
    string first;
    string second;
    };

    typedef vector<StringPair> StringArray;

    void fun_2(StringArray& Arr)
    {
    // do something with Arr
    }

    int main()
    {
    StringArray Arr;
    Arr.push_back(StringPair("ONE", "1"));
    Arr.push_back(StringPair("TWO", "2"));
    Arr.push_back(StringPair("THREE", "3"));
    }

    Now don't you think that a bit easier. Everything is dynamic, everything
    gets freed automatically.

    john
     
    John Harrison, Nov 2, 2004
    #4
  5. Rafi Kfir

    sirclif Guest

    #include <stdlib.h>
    #include <stdio.h>

    void print(char *arg[])
    {
    int i,j;
    for( i = 0; i < 3; i++)
    {
    for( j = 0; j < 4; j++)
    {
    printf("%c",arg[j]);
    }
    printf("\n");
    }
    }

    int main()
    {
    char **ch;
    int i,j;

    ch = (char**)calloc(3,sizeof(char*));
    for(i = 0; i < 3; i++)
    {
    ch = (char *)calloc(4,sizeof(char));
    }
    for(i = 0; i < 3; i++)
    {
    for(j = 0; j < 4; j++)
    {
    ch[j] = 'c';
    }
    }
    print(ch);

    return 0;
    }
     
    sirclif, Nov 2, 2004
    #5
  6. Rafi Kfir

    sirclif Guest

    #include <stdlib.h>
    #include <stdio.h>

    void print(char *arg[])
    {
    int i,j;
    for( i = 0; i < 3; i++)
    {
    for( j = 0; j < 4; j++)
    {
    printf("%c",arg[j]);
    }
    printf("\n");
    }
    }

    int main()
    {
    char **ch;
    int i,j;

    ch = (char**)calloc(3,sizeof(char*));
    for(i = 0; i < 3; i++)
    {
    ch = (char *)calloc(4,sizeof(char));
    }
    for(i = 0; i < 3; i++)
    {
    for(j = 0; j < 4; j++)
    {
    ch[j] = 'c';
    }
    }
    print(ch);

    return 0;
    }
     
    sirclif, Nov 2, 2004
    #6
  7. Rafi Kfir

    sirclif Guest

    #include <stdlib.h>
    #include <stdio.h>

    void print(char *arg[])
    {
    int i,j;
    for( i = 0; i < 3; i++)
    {
    for( j = 0; j < 4; j++)
    {
    printf("%c",arg[j]);
    }
    printf("\n");
    }
    }

    int main()
    {
    char **ch;
    int i,j;

    ch = (char**)calloc(3,sizeof(char*));
    for(i = 0; i < 3; i++)
    {
    ch = (char *)calloc(4,sizeof(char));
    }
    for(i = 0; i < 3; i++)
    {
    for(j = 0; j < 4; j++)
    {
    ch[j] = 'c';
    }
    }
    print(ch);

    return 0;
    }
     
    sirclif, Nov 2, 2004
    #7
  8. Rafi Kfir

    sirclif Guest

    oops, guess i should have read the bright red instruction at the top of the
    page telling me not to resubmit if my reply doent show up right away. sorry
    about that
     
    sirclif, Nov 2, 2004
    #8
  9. Rafi Kfir

    Jon Bell Guest

    In article <>,
    Rafi Kfir <> wrote:
    >
    >This may look as a smiple task to most of you, but to me (a beginner
    >with C), it drives me crazy.
    >
    >All I want is that one function passes a two dimensional array of
    >strings to another function.


    Doing this using old-style arrays and char* "strings" is *not* a simple
    task, even for experienced programmers. C++ has tools that make it much
    easier, namely the standard 'vector' and 'string' data types.

    >example:
    >NOTE: the strings can be of different length and the array will be
    >initialized many times to differnt values.


    No problem. The standard 'string' type automatically resizes itself
    appropriately.

    #include <vector>
    #include <string>

    using namespace std;

    >void fun_1()
    >{
    > char **Arr[3][2]= {'\0'}; //I want to define a 3x2 array of strings
    >of
    > //different length (max 32 ch)
    > //Arr initialization
    > // Arr ["ONE", "1"]
    > // ["Two", "2"]
    > // ["THREE", "3"]


    vector<vector<string> > Arr (3, vector<string>(2));
    Arr[0][0] = "ONE";
    Arr[0][1] = "1";
    // etc. for the other elements

    >
    > fun2(Arr);
    >}
    >
    >void fun_2(char **rcvArr)


    void fun_2 (vector<vector<string> >& rcvArr)
    // and make it const if you don't plan to modify the data inside the
    // function
    >{
    >
    >}


    --
    Jon Bell <> Presbyterian College
    Dept. of Physics and Computer Science Clinton, South Carolina USA
     
    Jon Bell, Nov 3, 2004
    #9
  10. Rafi Kfir

    JKop Guest

    void Func(char**);
    //I don't work with pointers to pointers much
    //so I'd have to look-up the correct way to make
    //the above argument const-correct.

    int main()
    {
    char* string_array[3][2];

    string_array[0][0] = "One";
    string_array[0][1] = "1";
    string_array[1][0] = "Two";
    string_array[1][1] = "2";
    string_array[2][0] = "Three";
    string_array[2][1] = "3";

    Func(string_array);
    }

    void Func(char** string_array);
    {

    }


    -JKop
     
    JKop, Nov 3, 2004
    #10
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Venkat
    Replies:
    4
    Views:
    975
    Venkat
    Dec 5, 2003
  2. Ben

    Strings, Strings and Damned Strings

    Ben, Jun 22, 2006, in forum: C Programming
    Replies:
    14
    Views:
    767
    Malcolm
    Jun 24, 2006
  3. Amit  Limaye
    Replies:
    4
    Views:
    457
    Phlip
    Apr 10, 2006
  4. Ed
    Replies:
    5
    Views:
    121
    Todd Benson
    Feb 21, 2008
  5. Peter Bailey

    simple, simple array question

    Peter Bailey, Apr 8, 2008, in forum: Ruby
    Replies:
    7
    Views:
    215
    Peter Bailey
    Apr 8, 2008
Loading...

Share This Page