我想知道如何从字符串中提取各种数字。我知道strtol有效,但它似乎只适用于第一个数字。
这是我的代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main(){
long v1, v2, v3;
char str[20] = "16,23";
char *d;
v1 = strtol(str, &d, 10);
v2 = strtol(str, &d, 10);
printf("string is %s\nv1 is:%i\nv2 is:%d\n",str , v1,v2);
return 0;
}
在这个例子中,我想输出v1 = 16和v2 = 23.
另一个例子,如果str是“12,23,34”,我想要v3 = 34
提前致谢:)
答案 0 :(得分:2)
你可以有很多方法。其中之一是使用前一个endptr
调用填充的strtol()
作为下一个strtol()
的来源。
否则,为了获得更好,更灵活的方法,您还可以选择使用strtok()
和预定义的分隔符(此处为,
)逐个获取令牌并将其转换为{{ 1}}或int
(如您所愿),直到long
返回NULL。
答案 1 :(得分:2)
使用long strtol(const char * nptr, char ** endptr, int base)
。 endptr
允许简单的后续解析,因为解析停止了。
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>
int string_to_longs(const char *s) {
#define N 3
long v[N];
int i;
for (i=0; i<N; i++) {
errno = 0;
char *end;
v[i] = strtol(s, &end, 10);
if (errno) return -1; // overflow
if (s == end) return -1; // no conversion
printf("v[%d] = %ld\n", i, v[i]);
if (*end == 0) break; // we are done
if (*end != ',') return -1; // missing comma
s = (const char *) (end + 1);
}
return i;
}
int main(void) {
string_to_longs("16,23");
string_to_longs("12,23,34");
return 0;
}
答案 2 :(得分:1)
strtol
只是将字符数组转换为long int。当它找到第一个从解释整数时没有意义的字符时停止。
string.h 中有一个名为strtok的函数可帮助您对字符串进行标记。
请注意strtok
会改变原始字符数组的内容。