Как можно преобразовать строку из слов в двумерный массив?

Рейтинг: -1Ответов: 2Опубликовано: 12.04.2023

Я написал простую программу, которая должна преобразовывать строку в двумерный массив, но алгоритм не работает. В итоге выводятся непонятные символы. Как можно написать программу, которая будет преобразовывать строку в двумерный массив на си, где каждый элемент это отдельное слово?

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

void main(void)
{
    char mainArr[30][50];
    char userSymbol;
    int i = 0;
    int j = 0;

    printf("Enter a string: ");
    while ((userSymbol = getchar()) != '\n' && i < 29 && j < 49)
    {
        mainArr[i][j] = userSymbol;
        if (mainArr[i][j] == ' ')
        {
            j++;
            i = 0;
            continue;
        }
        i++;
    }
    printf("\n");
    printf("My string is: %s", mainArr);
}

Ответы

▲ 0Принят

Для ввода строк, конечно, можно использовать функцию fgets и далее разбивать ее на слова,
но я сделал пример с таким же посимвольным вводом, что и у вас.

Для принятия правильного решения, что делать при чтении пробельного символа, используется переменная (флаг) in_word, которая становится равной 0, если мы прочли пробел (т.е. очередное слово закончилось).

Впрочем (надеюсь), в коде достаточно комментариев, чтобы в нем разобраться.

#include <stdio.h>
    
int
main (int ac, char *av[])
{
  char arr[50][30]; // 50 words, each max size 29 chars 
  int c,
    in_word = 0,    // flag -- where we are?
    i = 0,          // current word, i.e. line in the arr[]
    j = 0;          // position in the current word, i.e. column in the arr[]


  // enter one tty line with words, separated by one or more spaces
  while ((c = getchar()) != '\n' && c != EOF) {
    if (c == ' ') {
      if (in_word) {    // end of the current word
        arr[i][j] = 0;
        i++; j = 0;     // position of the next word in arr[]
        in_word = 0;    // now we are out of word
        if (i == 50)    // too many words
          break;
      }
    } else {
      if (j < 29)       // append new char to the current word
        arr[i][j++] = c;
      else
        arr[i][j] = 0;  // too long word
      in_word = 1;      // now we are inside the word
    }
  }
  if (in_word && i < 50) // '\n' may to terminate last word
    arr[i++][j] = 0;


  // print words
  puts("\nResult:");
  for (int k = 0; k < i; k++)
    puts(&arr[k][0]);
  
  return puts("End") == EOF;
}

Если есть вопросы, задавайте в комментариях.

▲ 0

Проблема возникает при попытке вывода двумерного массива с помощью формата строки "%s", который предназначен для вывода одномерных массивов строк. Для вывода двумерного массива необходимо использовать циклы. Также необходимо добавить символ конца строки после каждого слова, чтобы программа могла различать отдельные слова в массиве.

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

int main(void)
{
char mainArr[30][50];
char userSymbol;
int i = 0;
int j = 0;
int k = 0;

printf("Enter a string: ");
while ((userSymbol = getchar()) != '\n' && i < 30 && j < 50)
{
    mainArr[i][j] = userSymbol;
    if (mainArr[i][j] == ' ')
    {
        mainArr[i][j] = '\0';
        j++;
        i = 0;
        continue;
    }
    i++;
}

// добавляем нулевой символ в конец последней строки
mainArr[j][i] = '\0';

// выводим каждую строку отдельно
for (k = 0; k <= j; k++)
{
    printf("%s\n", mainArr[k]);
}

return 0;
}