从C中的char数组获取数字值

时间:2019-05-16 04:03:57

标签: c arrays

我有这个char数组:

gdoc = doc_service.documents().get(documentId=DOCUMENT_ID).execute()
doc = doc_service.documents().create(body=gdoc).execute()

我想获取字母char movimiento[]="L30 G10 L50 G-45 L-10 G50" 之后的数字值,并将它们存储到整数变量中以供以后使用

例如'L'

我已经尝试过,因为ASCII码数字从0 == 48开始,但是我不知道如何将字符存储为整数:concat 3、0并将它们存储为整数。

30, 50, -10

3 个答案:

答案 0 :(得分:3)

首先使用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 */
        ...

然后,您可以使用以下命令找到字符串中每个出现的前缀:

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

然后只需要尝试从下一个字符开始转换为long即可:

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就会用 if (n) putchar ('\n'); /* if integers found tidy up with newline */ } 更新为指向最后一位转换后的下一个字符,请参见{{3 }})

您基本上完成了。在这种情况下,您可以通过输出换行符来检查是否至少输出了一个数字并整理一下:

#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作为前缀字符,则可以将{{1} }一个字符串,并使用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

答案 1 :(得分:0)

#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;
}

答案 2 :(得分:0)

为此,您可以使用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 );
  }
}