Ваш char Array[1];
недостаточно велик для хранения чего-либо, кроме пустой строки.Кроме того, когда он работает, каждый указатель будет указывать на одну и ту же строку, которая будет последней записанной вами записью.Это приводит к некоторым исправлениям там, где это комментируется.
#include <stdio.h>
#include <stdlib.h> // instead of ctype.h
#include <string.h>
#define MAX 100
// This program takes an input of strings and prints them out with a new line separating each one.
int main() {
char *WordArray[MAX];
int i = 0;
int count = 0;
printf("enter up to 100 words, that are 20 characters maximum \n");
for (i = 0; i <100; i++){
char Array[21]; // increase size of array
scanf("%20s",Array); // limit entry length
if (strcmp(Array, "STOP") == 0) {
break;
}
WordArray[i] = strdup(Array); // allocate memory for and copy string
}
printf("The output is\n");
for (count = 0; count<i; count++){
printf("%s\n",WordArray[count]);
}
// free each string's memory
for (count = 0; count<i; count++){
free(WordArray[count]);
}
}
Вывод программы:
enter up to 100 words, that are 20 characters maximum
one two three STOP
The output is
one
two
three
Редактировать : обратите внимание, что ваш код содержит еще одно
неопределенное поведение помимо слишкомкороткая строка
char Array[1]
, которая означает, что вы разыменовываете указатель, который вы сохранили в
char *WordArray[MAX];
.
scope из
Array
находится внутри цикла
for
и теоретически перестает существовать после завершения цикла, поэтому сохраненный вами указатель недопустим.Здесь введенное слово дублируется с
strdup
, поэтому оно не применяется.