首页 > 解决方案 > 如何在令牌之间检索值

问题描述

我有一个关于令牌的问题。我创建了这个程序,它根据标记“[]”分割一个句子。但是,是否有可能检索它之间的字符?例如,我想从输入 [5000] 中检索数字 5000,其中“[ ]”是障碍标记,因此我可以稍后将该数字分配给变量。这是我的代码:

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

int main () {
   char str[ ] = "My balance is [5000]";
   const char s[ ] = "[]";
   char *token;

   
   token = strtok(str, s);

  
   while( token != NULL ) {
      printf( " %s\n", token );

      token = strtok(NULL, s);
   }

   return(0);
}

编辑:基本上我想知道如何将“[]”中的值分配给变量。假设我正在使用 fgets 提示用户键入整个句子,并将其余额放在括号 [] 中。如何创建一个程序来检索括号中的值并将其分配给一个值?

标签: arrayscstringtoken

解决方案


考虑使用strchr来查找[. 如果未找到,则返回 NULL 或指向[.
strcspn可用于定位一个]. 然后strncpy提取分隔符之间的字符串。
strtol也可以用来解析一个数字。它可以给出一个指向尾随字符的指针,在这种情况下是一个].

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

int main ( void) {
    char str[ ] = "My balance is [5000]";
    char out[sizeof str] = "";
    const char s[ ] = "[]";
    char *token;
    char *last;

    if ( ( token = strchr ( str, s[0]))) {//find [
        ++token;//advance to next character past [
        int count = strcspn ( token, &s[1]);//count characters to ]
        if ( token[count]) {//not the terminating zero
            strncpy ( out, token, sizeof out);
            out[count] = 0;
            //printf ( "%.*s\n", count, token);
            printf ( "out %s\n", out);
        }
        else {
            printf ( "could not find %c\n", s[1]);
        }

        long number = strtol ( token, &last, 10);
        if ( last == token) {
            printf ( "could not parse a number\n");
        }
        else if ( *last != s[1]) {
            printf ( "missing/misplaced delimiter\n");
        }
        else printf ( "number %ld\n", number);
    }
    else {
        printf ( "could not find %c\n", s[0]);
    }

    return 0;
}

推荐阅读