В вашем коде есть только две настоящие ошибки плюс одна строка, которая, ИМХО, безусловно, должна быть изменена. Вот ошибки с решениями:
(1) Как отмечено в комментариях, строка:
char *string[50],*p;
объявляет string
как массив из 50 символов указатели , тогда как вы просто хотите массив из 50 символов. Используйте это вместо:
char string[50], *p;
(2) Есть две проблемы со строкой: char * temp [50];Во-первых, как отмечено в (1), вы объявляете массив символьных указателей, а не массив символов. Во-вторых, поскольку это локально определяемая («автоматическая») переменная, она будет удалена при выходе из функции, поэтому ваша переменная p
в main
будет указывать на некоторую память, которая была удалена. Чтобы исправить это, вы можете объявить (локальную) переменную как static
, что означает, что она останется фиксированной в памяти (но см. Добавленную сноску об использовании static
переменных):
static char temp[50];
И наконец, опять же, как уже упоминалось в комментариях, вы должны , а не использовать функцию gets
, поскольку она теперь устарела (хотя некоторые компиляторы все еще поддерживают ее). Вместо этого вы должны использовать функцию fgets
и использовать stdin
в качестве «исходного файла»:
fgets(string, 49, stdin);/// gets() has been removed! Here, 2nd argument is max length.
Другая незначительная проблема - это использование функций strlen
и strncpy
. Первый фактически возвращает значение типа size_t
(всегда без знака целочисленного типа), а не int
(всегда со знаком );последний использует такой тип size_t
в качестве последнего аргумента. Таким образом, вы должны иметь эту строку вместо того, что у вас есть в настоящее время:
size_t size = (strlen(string) - i + 1);
Не стесняйтесь просить дальнейших разъяснений и / или объяснений.
РЕДАКТИРОВАТЬ: потенциальная проблема, когдас помощью static
Solution
Как отмечается в комментариях Basya , использование статических данных может вызвать проблемы, которые трудно отследить при разработке программ с несколькимипотоки: если два разных потока попытаются получить доступ к данным одновременно, вы получите (в лучшем случае) «гонку данных» и, что более вероятно, непредсказуемое поведение, которое трудно отследить. Лучшим способом в таких обстоятельствах является динамическое выделение памяти для переменной из «кучи» с использованием стандартной функции malloc
(определенной в <stdlib.h>
- обязательно #include
этот заголовок):
char* temp = malloc(50);
Если вы используете этот подход, обязательно освободите память, когда закончите с ней, используя функцию free()
. В вашем примере это будет в конце main
:
free(p);