Предлагайте:
- Используйте
strtok()
, чтобы разбить строку на токены.
- Используйте
atoi()
для преобразования токенов в int
с.
Чтобы выделить массив для хранения int
s, вы можете:
- Распределяйте при обработке каждого токена, используя
realloc()
или
- Выполните два прохода через строку, причем первый проход подсчитывает токены в строке и
malloc()
массив в одной операции.
* * 1 022 Пример: * 1 023 *
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
int* make_int_array(char* a_str, size_t* const a_elem_count)
{
int* result = 0;
char* tmp = a_str;
char* last_comma = 0;
/* Count how many ints will be extracted. */
*a_elem_count = 0;
while (*tmp)
{
if (',' == *tmp)
{
(*a_elem_count)++;
last_comma = tmp;
}
tmp++;
}
/* Add space for trailing int. */
*a_elem_count += last_comma < (a_str + strlen(a_str) - 1);
result = malloc(sizeof(int) * (*a_elem_count));
if (result)
{
size_t idx = 0;
char* token = strtok(a_str, ",");
while (token)
{
assert(idx < *a_elem_count);
*(result + idx++) = atoi(token);
token = strtok(0, ",");
}
}
return result;
}
int main()
{
char s[] = "312 ,22 ,+12 ,-12 ,5331";
int* int_list;
size_t int_list_count = 0;
printf("s=[%s]\n\n", s);
int_list = make_int_array(s, &int_list_count);
if (int_list)
{
size_t i;
for (i = 0; i < int_list_count; i++)
{
printf("%d\n", *(int_list + i));
}
printf("\n");
free(int_list);
}
return 0;
}
Выход:
s=[312 ,22 ,+12 ,-12 ,5331]
312
22
12
-12
5331