C语言 strtok() 分隔符后的特定元素

C language strtok() specific element after delimiter

我有一系列字符串,每个字符串都有字母、空格、数字和 $。我似乎无法弄清楚的是如何获得 $? 之后的数字?例如,

char s[50]= "I have  and 3 hours left to work.";
char t[50]= "He might have 4 left but does have .";
char u[50]= " and 30 equal 59 dollars.";
/* I'm assuming strtok, since it makes the most sense to me */

预期输出

20
 7
29

感谢任何帮助!

有很多可能的方法。

  • 你熟悉sscanf()吗?它可以用来完成这项工作(但这不是 sscanf() 的最简单用法)。
  • 你熟悉吗 strtod() 将字符串转换为 double,或者 strtol() 将字符串转换为 long?或者他们更简单的同行 atof()atoi()?
  • 您可以使用 strchr()strstr() 而不是 strtok()strtok() 的一个缺点是它具有破坏性和非信息性 — 它会删除一个分隔符并且不会告诉您它找到了哪个分隔符。这意味着您不能在字符串文字上使用 strtok()
  • 您也可以使用 strcspn()strpbrk() 代替 strchr().

这些的一些组合——单独 sscanf(),或者搜索函数之一加上 sscanf(),或者搜索函数之一加上转换函数之一——可以被制成完成任务。

你想从这些字符串中得到什么?

char nasty1[] = "Who writes $$ 20 and hopes to be OK?";
char nasty2[] = "He should have written one $, like .0000001";
char nasty3[] = "And $ 20 is too spaced out";
char nasty4[] = "Negative balances?  $-20 or - or () or $(20)?";

这些可能会使您的生活复杂化。您也可以决定不需要担心它们。

采样 strchr and sscanf

#include <stdio.h>
#include <string.h>

void print(int val){
    printf("%d\n", val);
}

void get(const char *s, void (*callback)(int)){
    int value;
    while((s = strchr(s, '$')) != NULL){
        if(1==sscanf(++s, "%d", &value)){
            callback(value);
        }
    }
}

int main(void){
    char s[50]= "I have  and 3 hours left to work.";
    char t[50]= "He might have 4 left but does have .";
    char u[50]= " and 30 equal 59 dollars.";

    char *a[] = { s, t, u};

    for(int i = 0; i < sizeof(a)/sizeof(*a); ++i){
        get(a[i], print);
    }
    return 0;
}