Как записать строку в массив?

В чем суть, как я понимаю, есть строка, которая и не строка совсем, как-будто указатель. Я хочу эту "строку-указатель" сунуть в массив, который назвала "otvet". НО вылезает ошибка error: invalid operands to binary + (have 'char *' and 'char *'). Пожалуйста, поглядите на мой код, скажите, что я делаю не так, кроме как того, что занимаюсь программированием :) Если интересно, задание: в стандартный поток ввода подается строка, состоящая из слов, длиной не более 100 символов. Слова состоят из латинских символов и разделены одним пробелом. Необходимо вывести в стандартный поток вывода строку, содержащую те же слова, но в обратном порядке.

#include <stdio.h>
#include <string.h>
 
int main()
{
  
  char str[100];
  
  scanf("%100[^\n]", str);
  
  char *otvet[100];
  
  char *pch = strtok(str, " "); 
  
  
  int i = 0;
  while (pch != NULL && i<100) 
  {
      //printf("\n%s", pch);
      otvet[i] += pch;
      
      pch = strtok(NULL, " ");
      i++;
  }
  return 0;
}

Ответы (1 шт):

Автор решения: Kane
#include <stdio.h>
#include <string.h>
 
int main()
{
  
  char str[100];

str это массив из 100 элементов типа char. Этот массив может хранить строку длиной до 99 символов (+ символ конца строки, '\0').

  scanf("%100[^\n]", str);

scanf() считывает строку длиной до 100 символов. Т.е. на один символ больше, чем размер буфера. Это может привести к переполнению буфера.

  char *otvet[100];

otvet это массив из 100 указателей на char.

  char *pch = strtok(str, " "); 
  
  int i = 0;
  while (pch != NULL && i<100) 
  {
      //printf("\n%s", pch);
      otvet[i] += pch;

otvet[i] это i-тый указатель на char в массиве. pch это указатель на первый символ в i-том слове, т.е. тоже char*. Ты их тут складываешь.

error: invalid operands to binary + (have 'char *' and 'char *')

Эта ошибка говорит, что нельзя складывать два указателя. Вместо этого, тебе нужно otvet[i] = pch, т.е. чтоб i-тый указатель в otvet указывал на i-тое слово.

      pch = strtok(NULL, " ");
      i++;
  }
  return 0;
}

После этого otvet[0] содержит указатель на первый символ в первом слове, otvet[1] -- на второе слово и т.д. Тебе теперь нужно вывести слова из otvet в обратном порядке:

while (i > 0) {
    printf("%s ", otvet[--i]);
}

Немного картинки, при вводе "Hello world ABC" по окончании программы память выглядит примерно так:

str ->     H  e  l  l  o \0  w  o  r  l  d \0  A  B  C \0
           0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
           ^                 ^                 ^
           |                 |                 |
otvet[0] --/ == &str[0]      |                 |
otvet[1] --------------------/ == &str[6]      |
otvet[2] --------------------------------------/ == &str[12]

i == 3
→ Ссылка