Задача: зчитати з файлу слова і дещо з ними зробити. У файлі буде кілька груп слів, у кожній групі спочатку йде число - кількість слів, а далі самі слова, тобто структура ось така:
Хочу вирішити задачу так, щоб було гарно і доступно учням/студентам. Але як пайтоно-джаваскрипто-рубісту важкувато приходиться у світі С
Наразі перший шматок задачі Я зробив ось так:
▼Прихований текст
#include<stdio.h>
#include<string.h>
const int MAX_WORDS = 10;
const int WORD_LENGTH = 15;
//typedef here can't take variables, even const, why?
typedef char word_array[10][15];
int read_words(FILE *f, int words_count, word_array words)
{
int word;
for (word=0; word<words_count; word++)
{
fscanf(f, "%s", &words[word]);
}
return 0;
}
int main()
{
// read input data
int i,d,p,r;
FILE *fi, *fo;
fi = fopen("sentence_input.txt", "r");
word_array sentence1;
fscanf(fi, "%d", &i);
read_words(fi, i, &sentence1);
// just printing to make sure it works
for (int word=0; word<i; word++)
{
printf("%s => ", sentence1[word]);
printf("%d\n", strlen(sentence1[word]));
}
fclose(fi);
}
Воно працює:
./sentence
i => 1
like => 4
to => 2
drink => 5
beer => 4
Але:
1) чому в typedef не можна задати розміри як константи, адже це не просто змінні, а саме константи?
2) компіляція стандартним gnu компілятором (gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.4) ) видає ще ось такі попердження:
▼Прихований текст
$ make sentence
cc sentence.c -o sentence
sentence.c: In function ‘read_words’:
sentence.c:14:19: warning: format ‘%s’ expects argument of type ‘char *’, but argument 3 has type ‘char (*)[15]’ [-Wformat=]
fscanf(f, "%s", &words[word]);
^
sentence.c: In function ‘main’:
sentence.c:29:23: warning: passing argument 3 of ‘read_words’ from incompatible pointer type [-Wincompatible-pointer-types]
read_words(fi, i, &nouns);
^
sentence.c:9:5: note: expected ‘char (*)[15]’ but argument is of type ‘char (*)[10][15]’
int read_words(FILE *f, int words_count, word_array words)
^
sentence.c:33:14: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘size_t {aka long unsigned int}’ [-Wformat=]
printf("%d\n", strlen(nouns[word]));
^
3) як правильно повернути із функції такий масив "слів", тобто return words і тоді присвоїти його у змінну у головній функції? (певно, через вказівники, бо в C хіба копіювати strcpy чи ше шось таке). Функція точно потрібна, бо групи слів будуть читатися неоднократно;
4) чи може є якийсь ще кращий підхід зчитування з файлу слів і заповнення масиву?