Как записать строку в массив?
В чем суть, как я понимаю, есть строка, которая и не строка совсем, как-будто указатель. Я хочу эту "строку-указатель" сунуть в массив, который назвала "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 шт):
#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