получить значение чисел из массива символов в C - PullRequest
1 голос
/ 16 мая 2019

У меня есть этот массив символов:

char movimiento[]="L30 G10 L50 G-45 L-10 G50"

Я хочу получить значение числа после буквы 'L' и сохранить их в целочисленной переменной для последующего использования

например. 30, 50, -10

Я пробовал это, так как кодовые номера ASCII начинаются с 0 == 48, но я не знаю, как сохранить символы в целое число: concat 3, 0 и сохранить их в целое число.

int i = 0;
while(movimiento[i] != '\0'){
    if(movimiento[i]=='L'){
        while(movimiento[i]!=' '){
        printf("%d",(movimiento[i+1]-48));
        i++;
        }
    }
    i++;
}

Ответы [ 3 ]

3 голосов
/ 16 мая 2019

Вы извлекаете каждое целое число после символа «префикс», сначала находя символ префикса с помощью strchr, а затем вызывая strtol, начиная со следующего символа после префикса.

С вашей строкой, некоторым префиксным символом, взятым из командной строки (или использующим 'L' по умолчанию, если не указан аргумент) и указателем на начало вашей строки:

int main (int argc, char **argv) {

    char movimiento[]="L30 G10 L50 G-45 L-10 G50",  /* string */
        prefix = argc > 1 ? *argv[1] : 'L',         /* prefix (L default) */
        *p = movimiento;                            /* pointer to string */

Затем вы можете найтикаждое вхождение префикса в вашей строке с:

    while ((p = strchr (p, prefix))) {  /* while next prefix found */
        ...

Тогда нужно просто попытаться преобразовать в long, начиная со следующего символа:

        errno = 0;          /* set errno zero */
        char *endptr;       /* end-pointer for strtol */
        long tmp = strtol (p + 1, &endptr, 0);  /* convert from next char */

и проверить возвращаемое значениес strtol вместе с endptr, чтобы проверить наличие ошибки в результате попытки преобразования:

        if (p == endptr)    /* no digits convertedd */
            p++;            /* advance to next and try again */

Если цифры были преобразованы и errno остается неустановленным, а значение long возвращаетсяstrtol находится в диапазоне int, тогда у вас есть хорошее целочисленное значение, используйте его любым удобным вам способом:

        else {
            /* if no error and in range of int -- good value */
            if (!errno && INT_MIN <= tmp && tmp <= INT_MAX) {
                int val = (int)tmp;
                printf (n ? ", %d" : "%d", val);    /* output int */
                n++;        /* increment counter */
            }
            p = endptr;     /* advance to one-past last digit converted */
        }

( примечание: , пока естьПрежде чем преобразовать цифры, p обновляется с помощью endptr, чтобы указывать на следующий символ после последней преобразованной цифры, см. man 3 strtol )

Вы в основном сделали.Вы можете проверить, был ли выведен хотя бы один номер, и привести в порядок, выведя новую строку в этом случае с помощью:

    if (n) putchar ('\n');  /* if integers found tidy up with newline */
}

Если положить его в целом, вы получите:

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

int main (int argc, char **argv) {

    char movimiento[]="L30 G10 L50 G-45 L-10 G50",  /* string */
        prefix = argc > 1 ? *argv[1] : 'L',         /* prefix (L default) */
        *p = movimiento;                            /* pointer to string */
    int n = 0;                                      /* counter */

    while ((p = strchr (p, prefix))) {  /* while next prefix found */
        errno = 0;          /* set errno zero */
        char *endptr;       /* end-pointer for strtol */
        long tmp = strtol (p + 1, &endptr, 0);  /* convert from next char */

        if (p == endptr)    /* no digits convertedd */
            p++;            /* advance to next and try again */
        else {
            /* if no error and in range of int -- good value */
            if (!errno && INT_MIN <= tmp && tmp <= INT_MAX) {
                int val = (int)tmp;
                printf (n ? ", %d" : "%d", val);    /* output int */
                n++;        /* increment counter */
            }
            p = endptr;     /* advance to one-past last digit converted */
        }
    }
    if (n) putchar ('\n');  /* if integers found tidy up with newline */
}

Пример Использование / Вывод

$ ./bin/intafterprefix
30, 50, -10

или с использованием префикса 'G':

$ ./bin/intafterprefix G
10, -45, 50

Просмотрите все и дайте мне знать, если у вас есть какие-либо дополнительные вопросы.


Обрабатывайте несколько префиксов с помощью strpbrk

Также отметьте, хотите ли вы иметь возможность передавать строку префиксов, позволяющую использовать "G" или "L" или "GL" в качестве префиксных символов, вы можете сделать prefix строкой и использовать strpbrk вместо strchr.Например, используя:

    char movimiento[]="L30 G10 L50 G-45 L-10 G50",  /* string */
        *prefix = argc > 1 ? argv[1] : "L",         /* prefix (L default) */
    ...
    while ((p = strpbrk (p, prefix))) { /* while next prefix found */
       ...

Пример использования / Вывод

Это позволит вам искать любой или все префиксы, например,

$ ./bin/intafterprefix2
30, 50, -10

$ ./bin/intafterprefix2 G
10, -45, 50

$ ./bin/intafterprefix2 GL
30, 10, 50, -45, -10, 50
0 голосов
/ 16 мая 2019

Для этого вы можете использовать sscanf

char movimiento[]="L30 G10 L50 G-45 L-10 G50";

struct coords { int l; int g; } coords[3];
if ( sscanf(movimiento, "L%d G%d L%d G%d L%d G%d"
  , &coords[0].l 
  , &coords[0].g
  , &coords[1].l 
  , &coords[1].g
  , &coords[2].l 
  , &coords[2].g
  ) == 6 )
{
  for (int i = 0; i < sizeof(coords)/sizeof(coords[0]); ++i)      
  {
    printf( "%d, %d\n", coords[i].l, coords[i].g );
  }
}
0 голосов
/ 16 мая 2019
#include <ctype.h>  // isalnum
#include <stdio.h>  // printf
#include <stdlib.h> // atoi
#include <string.h> // memset

int main() {
    char arr[256] = "L30 G10 L55434 G-45 L-10 G50 L3";
    char buf[256];
    memset(buf, 0, 256);

    for (size_t i = 0; i < sizeof(arr); ++i) {
        if (arr[i] == 'L') {
            size_t count = 0;
            while (isalnum(arr[i]) || arr[i] == '-') {
                ++i;
                buf[count++] = arr[i];
            }
            int number = atoi(buf);
            printf("%d\n", number);
            memset(buf, 0, 256);
        }
    }

    return 0;
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...