我有这个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
答案 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 );
}
}