Вы близки, но вы забыли выделить память для строки. Если вы работаете с POSIX-совместимыми системами (т.е. практически со всем, кроме Windows), используйте спецификатор формата %ms
scanf()
, чтобы выделить буфер для строки при ее чтении (обратите внимание, что это прекращается после пробела) :
scanf("%ms", &strs[i]);
Для Windows реализуйте gets()
-подобную функцию:
#include <stdlib.h>
#include <stdio.h>
int msgets(char **str)
{
int ch = 0;
size_t len = 0;
while(ch != '\n')
{
len++;
*str = realloc(*str, len);
ch = getchar();
(*str)[len-1] = ch;
}
(*str)[--len] = 0;
return len;
}
Вот как использовать его вместо строки scanf()
:
msgets(&strs[i]);
Кроме этого, ваш код выглядит хорошо.
Вот почти полный пример с моим кодом:
#include <stdlib.h>
#include <stdio.h>
int msgets(char **str)
{
int ch = 0;
size_t len = 0;
while(ch != '\n')
{
len++;
*str = realloc(*str, len);
ch = getchar();
(*str)[len-1] = ch;
}
(*str)[--len] = 0;
return len;
}
int main(void)
{
int nos; // number of strings
scanf("%d ", &nos);
char** strs = malloc(nos * sizeof(char*)); // array of strings
for (int i = 0; i < nos; i++) // receiving strings
{
msgets(&strs[i]);
}
/* Do something with strs[] here */
return 0;
}