Изменение части массива символов в массив целых чисел в C - PullRequest
1 голос
/ 09 ноября 2011

Я просматриваю файл данных, содержащий как слова, так и цифры, и мне нужно извлечь числа из каждой строки и сохранить их в массиве.

Cheryl 2 1 0 1 2 0  
Neal 0 0 2 0 2 0  
Henry 0 2 2 0 2 0  
Lisa 0 0 0 0 2 1

Вот как файл отформатирован. Я начинаю с ввода каждой строки в массив participants[], а затем мне нужно взять числа из каждой строки и поместить их в отдельный двумерный массив по отдельности. то есть первая строка будет переведена на

responses[0][0] = 2
responses[0][1] = 1
responses[0][2] = 0
responses[0][3] = 1
responses[0][4] = 2
responses[0][5] = 0

В этот момент я обнаруживаю первый пробел с помощью char *pointer = strstr(" ", participants[]); и могу определить начало чисел с помощью strcpy(temp, pointer+1);.
С этого момента я сталкиваюсь с проблемами, поскольку мне трудно переводить строку чисел (все еще char строка) в отдельные целочисленные значения, которые будут сохранены в моем массиве responses[][].

Спасибо!

Ответы [ 2 ]

1 голос
/ 09 ноября 2011

Если это ваш точный формат, то, возможно, fscanf / sscanf может выполнить эту работу за вас? то есть.

#include <stdio.h>

int main(void)
{
   int nums[6]; 
   char line[] = "Cheryl 2 1 0 1 2 0";

   sscanf(line, "%*s %d %d %d %d %d %d", &nums[0], &nums[1], &nums[2], &nums[3], &nums[4], &nums[5]);

   printf("%d %d %d %d %d %d\n", nums[0], nums[1], nums[2], nums[3], nums[4], nums[5]);

   return 0;
}

Выход:

2 1 0 1 2 0

А затем просто проверьте возвращаемое значение, чтобы убедиться, что правильное количество чисел было прочитано.

РЕДАКТИРОВАТЬ: Для произвольной суммы:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *strchr_ignore_start(const char *str, int c)
{
   if (c == '\0') return strchr(str, c); /* just to be pedantic */

   /* ignore c from the start of the string until there's a different char */
   while (*str == c) str++;

   return strchr(str, c);
}

size_t extractNums(char *line, unsigned *nums, size_t num_count)
{
   size_t i, count;
   char *endptr = line;

   for (i = 0, count = 0; i < num_count; i++, count++) {
      nums[i] = strtoul(line, &endptr, 10);
      if (line == endptr) /* no digits, strtol failed */
         break;

      line = endptr;
   }

   return count;
}

int main(void)
{
   unsigned i, nums[9];
   char line[] = "Cheryl 2 1 0 1 2 0 0 1 2";
   char *without_name;

   /* point to the first space AFTER the name (we don't want ones before) */  
   without_name = strchr_ignore_start(line, ' ');

   printf("%u numbers were successfully read\n",
          (unsigned)extractNums(without_name, nums, 9));

   for (i = 0; i < 9; i++)
      printf("%d ", nums[i]);

   putchar('\n');

   return EXIT_SUCCESS;
}
0 голосов
/ 09 ноября 2011

strtok() кажется здесь очевидным решением:

char buf[1024];
int y;
for(y=0;fgets(buf, sizeof buf, file); y++){
     strtok(buf, " "); //burn name;
     char *str;
     int x = 0;
     for(str=strtok(NULL, " "); str; str=strtok(NULL, " ")){
          responses[y][x++] =  atoi(str);
     }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...