How to add a string to a 2D array in C

11.5k views Asked by At

i am starting to learn C and I have ran into the problem of adding a string input to a 2D array, i am able to get the string input correctly but when i try and add the string element to the array it is not working as expected.When printing the array(which is how i test the program) it will assign each index in the array a single character instead of the entire string.

And here is my code for viewing, thank you very much in advance i appreciate any help that is posted.

#include <stdio.h>
main()
{
    char c_array[3][3];
    int x;
    int y;
    int z=10;
    int i_user_input;
    char c_name[256];


    for(x=0;x<=+2;x++)
    {
        for(y=0;y<=2;y++)
        {
            printf("\nPlease enter a name to the system:");
            scanf(" %s",&c_array[x][y]);
            printf("The string is %s\n",c_name);
            printf("Please press '1' if you would like to keep entering names\n");
            printf("Please press '2' if you would like to print the list of names:");
            scanf("%d",&i_user_input);
            if(i_user_input==1)
                continue;
            if(i_user_input==2)
                for(x=0;x<=2;x++)
                {
                    for(y=0;y<=2;y++)
                    {
                        printf("c_array[%d][%d]=%c\n",x,y,c_array[x][y]);
                    }
                }
        }

    }

}

The output looks as follows with the sample input 'Penelope!'

c_array[0][0]=P
c_array[0][1]=e
c_array[0][2]=n
c_array[1][0]=e
c_array[1][1]=l
c_array[1][2]=o
c_array[2][0]=p
c_array[2][1]=e
c_array[2][2]=!
6

There are 6 answers

0
Sourav Ghosh On

In your code

scanf(" %s",&c_array[x][y]);
printf("The string is %s\n",c_name);

both the statements are wrong.

  1. %s expects a pointer to an array, not a single char. To scan a single char, you need %c format specifier.
  2. c_name, as used in the printf() is uninitialised. Using uninitialised value invokes undefined behaviour.

Solution: To take input element by element, you can do do something like

for(x=0; x<=2 ;x++)
    {
        printf("Start entering the name, one character at a time\n");
        for(y=0; y< 2; y++)                //note only '<' here
        {
            scanf(" %c", &c_array[x][y]);  // note the leading space
        }
        c_array[x][y] = 0;                 //null termination of array to be used as string
    }
0
A.S.H On

When you declare: char c_array[3][3];

This means that each element of your 2D array is a "char" (a single character); not a "string of characters".

To have each element be a string of characters, you need to declare your array in the following way: char string_array[3][3][256];

I am not sure this is what you want to do though. Mw feeling is that you want an array of 3 elements where each element is a string. In that case, [3] is hardly enough, your strings will have to be less than two characters (the third being reserved for the terminating zero).

5
Ranger On

If you want to assign a string to each index in the array, then create the array as follows :

#include<stdio.h>
int main(void) 
{
    char a[2][10];
    int i=0;
    char temp[20];
    for(i=0;i<2;i++)
    {
        scanf("%s",temp);
        strcpy(a[i],temp);
    }
    printf("%s",a[0]);
    return 0;
}

Each string that you enter will be stored in each index of the array.

0
autistic On

Strings aren't a type. They're a value pattern, like if you say an int stores a multiple of ten, then it ends in 0... If you say an array of char stores a string, then it ends at the first '\0', see? We can store multiples of ten in different kinds of integer variables, and likewise for strings.

Strings are patterns of values, not types. When choosing which integer type we want to use, we consider the range for integers. We choose int for small integer values (less than 32768), long for larger values (less than 2147483648) or long long for values larger than that. As a result, we choose the correct type of integer depending on the multiple of ten we expect. Likewise for strings, we need to make sure we have enough memory for the characters in the string followed by the '\0' at the end.

The character &c_array[x][y] only has enough memory for 0 characters followed by a '\0' at the end; it's only useful for storing an empty string. Perhaps you meant to declare c_array like this:

char c_array[3][3][256];

In this case, scanf expects %s to correspond to an argument of the type char *... but as your compiler will probably warn you, &c_array[x][y] will have the type char (*)[256]. If you want to fix that warning, you'll need to remove the & from your scanf code:

if (scanf("%s", c_array[x][y]) != 1) {
    /* XXX: Handle an error here,                *
     * e.g. by exiting or returning or something */
}

While we're on that topic, you'll notice that I removed the redundant space; %s already performs the functionality that the format directive would perform. I also wrote code to check the return value of scanf, as you should...


Remember how we spoke about choosing the types of integers that we use to store data? One other consideration is whether or not the data we intend to store can be negative. Consider this: In your code, should x and y be able to store negative values? What sense does a negative array index make? It is advisable that all array indexes be declared as size_t. When you use printf to print a size_t value, you'll want to use the %zu format specifier rather than %d.


char c_name[256];
/* ... */
printf("The string is %s\n",c_name);

Now, if the string is stored into c_array[x][y], then what is the point of c_name? That's an unnecessary variable. Use c_array[x][y], instead.


printf("\nPlease enter a name to the system:");

Common implementations will often refrain from printing characters until a '\n' is written; the line is printed all at once rather than character by character. As a result, you might see some strange behaviour such as this line not appearing at the right time. Fix this problem by putting the '\n' on the end of the line, rather than the beginning:

printf("Please enter a name to the system:\n");

... or use puts, which adds a '\n' for you automatically:

puts("Please enter a name to the system:");

... or use fflush, which will write all pending unwritten data even if there is no '\n':

fflush(stdout);
0
BLUEPIXY On
#include <stdio.h>
#include <string.h>

int main(void){
    char c_array[3][3];
    int x;
    int y;
    //int z=10;//unused
    int i_user_input;
    char c_name[256];

    printf("\nPlease enter a name to the system:");
    scanf("%255s",c_name);
    printf("The string is %s\n",c_name);
    printf("Please press '1' if you would like to keep entering names\n");
    printf("Please press '2' if you would like to print the list of names:");
    scanf("%d", &i_user_input);
    if(i_user_input==1)
        ;
    else if(i_user_input==2){
        memcpy(c_array, c_name, sizeof(c_array));
        for(x=0;x<3;x++){
            for(y=0;y<3;y++){
                printf("c_array[%d][%d]=%c\n", x, y, c_array[x][y]);
            }
        }
    }
}

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

#define SIZE 3

int main(void){
    char *c_array[SIZE][SIZE] = { NULL };
    int x;
    int y;
    //int z=10;//unused
    int i_user_input;
    char c_name[256];

    for(x=0;x<SIZE;x++){
        for(y=0;y<SIZE;y++){
            printf("\nPlease enter a name to the system:");
            scanf("%255s", c_name);
            printf("The string is %s\n", c_name);
            printf("Please press '1' if you would like to keep entering names\n");
            printf("Please press '2' if you would like to print the list of names:");
            scanf("%d", &i_user_input);
            c_array[x][y] = strdup(c_name);
            if(i_user_input==1){
                continue;
            }
            if(i_user_input==2){
                int x, y;//local variable
                for(x=0;x<SIZE;x++){
                    for(y=0;y<SIZE;y++){
                        if(c_array[x][y] != NULL)
                            printf("c_array[%d][%d]=%s\n", x, y, c_array[x][y]);
                    }
                }
            }
        }
    }
    for(x=0;x<SIZE;x++)
        for(y=0;y<SIZE;y++)
            free(c_array[x][y]);
}
0
Pynchia On

Why not use pointers in you array/matrix?

#include <stdio.h>
#include <string.h>

main()
{
char *c_array[3][3];
int x;
int y;
int z=10;
int i_user_input;
char c_name[256];

for(x=0;x<=+2;x++)
{
    for(y=0;y<=2;y++)
    {
        printf("\nPlease enter a name to the system:");
        scanf(" %s",c_name);
        new_string = malloc(strlen(c_name)+1)
        if (new_string == NULL) {
         print("error allocating string\n")
         exit(-1);
        }
        strcpy(new_string, c_name);
        c_array[x][y] = new_string

        printf("The string is %s\n",c_name);
        printf("Please press '1' if you would like to keep entering names\n");
        printf("Please press '2' if you would like to print the list of names:");
        scanf("%d",&i_user_input);
        if(i_user_input==1)
            continue;
        if(i_user_input==2)
            for(x=0;x<=2;x++)
            {
                for(y=0;y<=2;y++)
                {
                    printf("c_array[%d][%d]=%c\n",x,y,c_array[x][y]);
                }
            }
    }
}
for(x=0;x<=2;x++) {
 for(y=0;y<=2;y++) {
  free(c_array[x][y])
 }
} 
}

The code above stores the input string in each cell of the array, if that is your goal.

Note: I have no tried it, so there may be subtle errors. My point is to show you how to use pointers and their equivalence to arrays. Using C without pointers is pointless. :)