Home > front end >  How do I take a user input in the form of a matrix in C?
How do I take a user input in the form of a matrix in C?

Time:05-02

I am trying to code a program that asks the user for the # of rows and columns and generates a 2d array (a matrix) corresponding to their input. I then ask for a second matrix (same dimensions), then I do some math on the 2 matrices. I'm stuck on how to use the scanf function to get the user-inputted matrix. According to the guidelines, the user input will be in the shape of the matrix itself, ex if it is a 2x2 matrix the user enters: 12 10 (then on the next line) 10 10 How do I use the scanf function appropriately to copy this matrix into the 2d array that I've created? I know that you can do scanf("%d %d %d", &int1, &int2, &int3), but I don't know if this will work for a user-determined matrix, since the length could be 2, 10, even a 100 (which is max length for this problem).

#include <stdio.h>
    
    int main(void) {
      int r;
      int c;
      printf("Please enter the number of rows : ");
      scanf("%d", &r);
      
      printf("Please enter the number of columns : ");
      scanf("%d", &c);
      
      int matrixA[r][c];
/*User enters matrix in the form:
  12 10
  10 10
*/

      printf("Enter Matrix A\n");
      for(int i=0; i<sizeof(matrixA); i  ){
        for(int j=0; j<sizeof(matrixA[i]);i  ){
          scanf("%d ",&matrixA[i][j]);
        }
        
      }
    
    //to see if scanf worked
    
      for (int i = 0; i<sizeof(matrixA); i  ) {
            for(int j=0; j<sizeof(matrixA[i]);i  ) {
                matrixA[i][j] = '.';
                printf("%c ",matrixA[i][j]);
            }
            printf("\n");
        }
      int matrixB[r][c];
      
      
      printf("Enter Matrix B\n");
      
      return 0;
      
    }

CodePudding user response:

You are right that

scanf( "%d %d %d", &int1, &int2, &int3 );

will only work if the number of parameters is fixed at compile-time. It cannot be changed at run-time.

Your idea of calling

scanf("%d ",&matrixA[i][j]);

in a loop instead is correct, in principle. However, you should not have a space character in the format string, as this will cause scanf to continue to read input from the input stream, and it will only return after it has encountered a non-whitespace character. This is usually not what you want.

Also, the line

for(int i=0; i<sizeof(matrixA); i  ){

is wrong, because sizeof(matrixA) is the size of the array in bytes. Since you instead want to get the number of elements in the outer array, you could write sizeof matrixA / sizeof *matrixA instead. (The parentheses are only necessary when referring to types, not variables.) However, in this case, it would be easier to simply use r instead.

The line

for(int j=0; j<sizeof(matrixA[i]);i  ){

is wrong. You probably intended to write j instead of i .

Also, when printing variables of type int with printf, you should usually use %d instead of %c, because otherwise the value may be truncated if the value is higher than 127.

It is unclear what the line

matrixA[i][j] = '.';

is supposed to accomplish, as this will overwrite the previous input of scanf (assuming that you fix your loop as described above).

After fixing all of the issues mentioned above, your code should look like this:

#include <stdio.h>
    
int main(void)
{
    int r;
    int c;

    printf("Please enter the number of rows : ");
    scanf("%d", &r);
      
    printf("Please enter the number of columns : ");
    scanf("%d", &c);
      
    int matrixA[r][c];

    printf("Enter Matrix A:\n");
    for ( int i=0; i < r; i   )
        for( int j=0; j < c; j   )
            scanf( "%d", &matrixA[i][j] );


    //to see if scanf worked

    printf( "Input complete, the array contents are:\n" );

    for ( int i=0; i < r; i   )
    {
        for( int j=0; j < c; j   )
            printf( "%d ",matrixA[i][j] );

        printf( "\n" );
    }

    return 0; 
}

This program has the following behavior:

Please enter the number of rows : 4
Please enter the number of columns : 4
Enter Matrix A:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
Input complete, the array contents are:
1 2 3 4 
5 6 7 8 
9 10 11 12 
13 14 15 16 

CodePudding user response:

POSIX-specific answer

Well, you don't. There are two ways to get that done:

  1. Slice stdin into rows by the '\n' character n times; later slice every row in n columns by ' ' the whitespace. getline and strtok come in handy here.
  2. The other approach is more efficient and as usual more complicated: rather than slicing into rows first, you iterative cut-off cols, counting them, and when count == n comes true, you expect '\n' to be there thus ending another line. I wouldn't suggest this approach.

So roughly your codes looks something like:

ssize_t nread;
for (sizet_t i = 0; i < n; i  ) {
    char *line = NULL;
    if ((nread = getline(&line, &len, stream)) != -1) {
        fprintf(stderr, "Bad format: %il-th line expected.", i   );
        exit(EXIT_FAILURE);
    }
    char* token = strtok(line, " ");
    for (size_t ii = 1 /* because you've already cut-off the first token */; i < n; ii  ) {
       token = strtok(NULL, " ");
    }
}

Of course, you have to parse your char * tokens, but that is something I leave to you as an exercise. It also quite sloppy and does not do any sort of validation a production code is expected to do.

  •  Tags:  
  • c
  • Related