0

我想知道如何从字符串中提取各种数字。我知道 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

提前致谢 :)

4

3 回答 3

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;
}
于 2015-10-01T15:53:54.460 回答
2

你可以有很多方法。其中之一是利用endptr由上一个调用填充的 ,strtol()作为下一个调用的源strtol()

否则,为了获得更好和更灵活的方法,您还可以选择使用strtok()预定义的分隔符(,此处)来逐个获取标记并将它们转换为intlong(如您所愿)直到strtok()返回 NULL。

于 2015-10-01T15:15:47.413 回答
1

strtol只是将字符数组转换为 long int。当它发现第一个对解释整数没有意义的字符时,它就会停止。

string.h中有一个名为strtok的函数,可以帮助您标记字符串。

请注意,这会strtok改变原始字符数组的内容。

于 2015-10-01T15:18:29.057 回答