Как сделать динамический массив слов в Си?
Мне поставили задачу сделать ввод текста по словам, которые будут храниться в words. Я понял, что char* words[] - это массив слов. Мне нужно, чтобы выделялось определенное количество байт для каждого слова (кажется, у меня это получилось сделать, но не так, как надо)
Еще не получается остановить цикл ввода: не знаю как сделать условие остановки. Пробовал tmp != EOF и if(scanf("%s", tmp) !=1);
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#define WORDS_ARRAY_SIZE 100
#define MAX_STR_LEN 50
int main(){
char* words[WORDS_ARRAY_SIZE];
for (int i = 0; i < WORDS_ARRAY_SIZE; i++) {
words[i] = NULL;
}
char tmp[MAX_STR_LEN];//временный массив для слова
for(int i = 0; i < WORDS_ARRAY_SIZE ; i++){
scanf("%s", tmp);
//узнаю размер слова в массиве tmp и увеличиваю words[i]
words[i] = (char *)malloc(sizeof(char)*(strlen(tmp)));
if(words[i] == NULL){
printf("faill");
exit(0);
}
//здесь я попытался поместить tmp в words но это не работает
words[i] = tmp;
}
free(words);//ругается на это
return 0;
}
И еще выдает ошибку SIGABRT в строке free(words);
Ответы (1 шт):
указатель на выделенную память вы меняете на адрес локального массива
words[i] = tmp;
,а нужно копирование строки с одного места памяти в другое с помощью
strcpy(words[i],tmp);
удалять локальный массив вы не имеете права, вы память для него не выделяли
free(words);
всю память, что вы выделяли, от той и отказывайтесь
for(int i = 0; i < words_N ; i++)
free (words[i]);
память выделяли мало, не хватает для конечного символа конца строки
'\00'words[i] = (char *)malloc(sizeof(char)*(strlen(tmp) + 1));чтобы закончить ввод строк, придумайте ключевое слово, и останавливайтесь, как удобно.
if (strlen(tmp) == 1 && tmp[0] == 'X') { words_N = i ; break; }
// gcc -std=c11 -Wall -Wextra -Wpedantic -Winline -Os words.c -o words
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#define WORDS_ARRAY_SIZE 100
#define MAX_STR_LEN 50
int main(){
char* words[WORDS_ARRAY_SIZE];
for (int i = 0; i < WORDS_ARRAY_SIZE; i++) {
words[i] = NULL;
}
char tmp[MAX_STR_LEN];//временный массив для слова
int words_N = WORDS_ARRAY_SIZE ;
for(int i = 0; i < WORDS_ARRAY_SIZE ; i++){
scanf("%s", tmp);
// ключевое слово сделайте "X" для выхода
if (strlen(tmp) == 1 && tmp[0] == 'X') {
words_N = i ;
break; }
//узнаю размер слова в массиве tmp и увеличиваю words[i]
// память выделяли мало, не хватает для конечного символа конца строки '\00'
words[i] = (char *)malloc(sizeof(char)*(strlen(tmp) + 1));
if(words[i] == NULL){
printf("faill");
exit(0);
}
// указатель на выделенную память вы меняете на адрес локального массива
// words[i] = tmp;
// копируем строку из tmp в words[i]
strcpy(words[i],tmp);
}
// free(words);
// удалять локальный массив вы не имеете права, вы память для него не выделяли
// всю память, что вы выделяли, от той и отказывайтесь
for(int i = 0; i < words_N ; i++)
free (words[i]);
return 0;
}