从 *char 解析 int 的快速简便方法

ego*_*pts 1 c string parsing numbers

我有以下字符串

char *filename = "/home/data/slice-10-1.dat";
Run Code Online (Sandbox Code Playgroud)

我需要解析以下内容

int sliceTime
int sliceIndex;
Run Code Online (Sandbox Code Playgroud)

sliceTime应该是 10 并且sliceOrder应该是 1

gsa*_*ras 5

使用strtok()atoi()像这样:

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

int main (void)
{
  char str[] = "/home/data/slice-10-1.dat";
  int sliceTime, sliceIndex, counter = 0;
  char * pch;
  pch = strtok (str," ./-");
  while (pch != NULL)
  {
    //printf("%s\n" ,pch);
    size_t ln = strlen(pch) - 1;
    if( pch[ln] == '\n' ) pch[ln] = '\0';
    int notNumber = 0;
    /* Ensure that input is a number */
    for(size_t i = 0; i < ln; i++) {
      if( !isdigit(pch[i]) ) {
        notNumber = 1;
      }
    }
    if(!notNumber)
        if(counter++ == 0)
            sliceTime = atoi(pch);
        else
            sliceIndex = atoi(pch);
    pch = strtok (NULL, " ./-");
  }
  printf("SliceTime = %d, SliceIndex = %d\n", sliceTime, sliceIndex);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

切片时间 = 10,切片索引 = 1


如果您始终具有相同的字符串模式,请使用 BLUEPIXY 的解决方案,方法是sscanf()

#include <stdio.h>

int main(void) {
    char *filename = "/home/data/slice-10-1.dat";
    int sliceTime, sliceIndex;
    if(sscanf(filename, "%*[^-]-%d-%d", &sliceTime, &sliceIndex) == 2){
        printf("%d, %d\n", sliceTime, sliceIndex);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

10, 1