Как можно преобразовать строку из слов в двумерный массив?
Я написал простую программу, которая должна преобразовывать строку в двумерный массив, но алгоритм не работает. В итоге выводятся непонятные символы. Как можно написать программу, которая будет преобразовывать строку в двумерный массив на си, где каждый элемент это отдельное слово?
#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);
}
Ответы (2 шт):
Проблема возникает при попытке вывода двумерного массива с помощью формата строки "%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;
}
Для ввода строк, конечно, можно использовать функцию 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;
}
Если есть вопросы, задавайте в комментариях.