【问题标题】:How to extract various integers from a string in C?如何从C中的字符串中提取各种整数?
【发布时间】:2015-10-01 15:13:40
【问题描述】:

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

提前致谢:)

【问题讨论】:

  • 所有整数都用逗号分隔吗?
  • 这被称为 tokenizing 一个字符串。如果你搜索tokenize c,你会得到很多有用的结果。这是关于 SO 的相关问题。 stackoverflow.com/questions/53849/…
  • 是的,整数用逗号分隔
  • 更改为v2 = strtol(d+1, &amp;d, 10);
  • 然后你可以使用 strtok_r 函数标记字符串,然后使用 strtol 或 atoi 将标记转换为整数

标签: c integer strtol


【解决方案1】:

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

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

【讨论】:

    【解决方案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;
    }
    

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-07-06
        • 2017-07-07
        • 1970-01-01
        • 2015-06-18
        • 1970-01-01
        相关资源
        最近更新 更多