Разделение строки на массив строк в СИ
Вот тут я ввожу строку и заношу ее в str.
Код:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void)
{
char *str;
str=malloc(sizeof(*str) * 100)
gets(str);
printf("%s",str);
return 0;
}
#include <string.h>
#include <stdlib.h>
int main(void)
{
char *str;
str=malloc(sizeof(*str) * 100)
gets(str);
printf("%s",str);
return 0;
}
Си грубо не знаю.Делал похожие задание на шарпе 2 года назад.Честно говоря попроще было=)
Кто может настрочите код пожалуйста(думаю он будет не большой). Заранее благодарен.
Код:
#include <stdio.h>
#include <string.h>
#include <malloc.h>
typedef struct {
char** arr;
size_t cnt;
} array_t;
#define array_init(a) (a).arr = NULL, (a).cnt = 0
void array_clear(array_t* a);
int array_resize(array_t* a, size_t n);
void array_strtok(array_t* a, char* s, const char* delim);
int main(void){
array_t a;
size_t i;
char s[128];
printf("Enter str: ");
scanf("%127[^\n]", s);
array_init(a);
array_strtok(&a, s, " \r\n\t,.?!");
for(i = 0; i < a.cnt; ++i)
puts(a.arr[i]);
array_clear(&a);
return 0;
}
/* разбиение строки на слова */
void array_strtok(array_t* a, char* s, const char* delim){
char* i, *j;
size_t m, n = 0;
/* подсчитываем кол-во слов */
for(i = s; *i; i = j){
while(*i && (strchr(delim, *i) != NULL))
++i;
j = i;
while(*j && (strchr(delim, *j) == NULL))
++j;
if(j > i)
++n;
}
if(! array_resize(a, n))
return;
m = 0;
for(i = strtok(s, delim); i != NULL; i = strtok(NULL, delim))
a->arr[m++] = strdup(i);
}
/* удаление массива */
void array_clear(array_t* a){
size_t i;
if(a->arr != NULL){
for(i = 0; i < a->cnt; ++i)
free(a->arr[i]);
free(a->arr);
a->arr = NULL;
a->cnt = 0;
}
}
/* выделение памяти под массив */
int array_resize(array_t* a, size_t n){
size_t i;
array_clear(a);
a->arr = (char**)malloc(n * sizeof(char*));
if(a->arr == NULL)
return 0;
for(i = 0; i < n; ++i)
a->arr[i] = NULL;
a->cnt = n;
return 1;
}
#include <string.h>
#include <malloc.h>
typedef struct {
char** arr;
size_t cnt;
} array_t;
#define array_init(a) (a).arr = NULL, (a).cnt = 0
void array_clear(array_t* a);
int array_resize(array_t* a, size_t n);
void array_strtok(array_t* a, char* s, const char* delim);
int main(void){
array_t a;
size_t i;
char s[128];
printf("Enter str: ");
scanf("%127[^\n]", s);
array_init(a);
array_strtok(&a, s, " \r\n\t,.?!");
for(i = 0; i < a.cnt; ++i)
puts(a.arr[i]);
array_clear(&a);
return 0;
}
/* разбиение строки на слова */
void array_strtok(array_t* a, char* s, const char* delim){
char* i, *j;
size_t m, n = 0;
/* подсчитываем кол-во слов */
for(i = s; *i; i = j){
while(*i && (strchr(delim, *i) != NULL))
++i;
j = i;
while(*j && (strchr(delim, *j) == NULL))
++j;
if(j > i)
++n;
}
if(! array_resize(a, n))
return;
m = 0;
for(i = strtok(s, delim); i != NULL; i = strtok(NULL, delim))
a->arr[m++] = strdup(i);
}
/* удаление массива */
void array_clear(array_t* a){
size_t i;
if(a->arr != NULL){
for(i = 0; i < a->cnt; ++i)
free(a->arr[i]);
free(a->arr);
a->arr = NULL;
a->cnt = 0;
}
}
/* выделение памяти под массив */
int array_resize(array_t* a, size_t n){
size_t i;
array_clear(a);
a->arr = (char**)malloc(n * sizeof(char*));
if(a->arr == NULL)
return 0;
for(i = 0; i < n; ++i)
a->arr[i] = NULL;
a->cnt = n;
return 1;
}