如何从字符串中分隔字母和整数?

时间:2017-04-15 19:02:38

标签: c string

我需要在不同的变量(来自字符串)中分配数字,并使用字母对数字进行一些操作。

m -15 3 c 1 -15 1 11 m 2 2 r 30 m -11 40 l 60 m 1 5 d<br>


- 每个字母代表一个动作
- 每个数字是测量值 -user给出了这个输入,我不知道如何单独分配,或者在将输入分配为字符串之后我无法分开。
(也找不到合适的词组来搜索)
我试过这样的:

while(input[i]!='\0'){
        switch(input[i]){
            i++;
            case 'm': a=input[i]*input[i+2];
                      printf("%d",a);
                      i+=6; // going for the next letter if i assume that
                           // user gave the input with single spaces between every integer or letter 
                      break;
            case 'c': ............................
                      i+=4;
                      printf("\n----CASE C");
                      break;

            default: printf("\nDEFAULT"); return 0;

        }

    }
像这样的东西,但真实的用户可能没有空格或有很多空格而且不确定输入用户会给出多少,所以有没有办法提取整数? (字母也很重要,整数可以是负数)

1 个答案:

答案 0 :(得分:1)

使用sscanf()查找模式

"%n"记录扫描的字符数。

如果字符串匹配,

sscanf(&input[i], " m%d%d %n", &op[0], &op[1], &n)将返回2:

optional-space `m` optional-space integer optional-space integer optional-space   

并将n设置为扫描的字符数。

#include <stdio.h>
int main() {
  char input[] = "m -15 3 c 1 -15 1 11 m 2 2 r 30 m -11 40 l 60 m 1 5 d\n";

  int op[4];
  int i = 0;

  while (input[i]) {
    int n = 0;
    if (sscanf(&input[i], " m%d%d %n", &op[0], &op[1], &n) == 2) {
      printf("CASE m: %d\n", op[0] * op[1]);
    } else if (sscanf(&input[i], " c%d%d%d%d %n", &op[0], &op[1], &op[2], &op[3], &n) ==4){
      printf("CASE c\n");
    } else if (sscanf(&input[i], " r%d %n", &op[0], &n) == 1) {
      printf("CASE r\n");
    } else if (sscanf(&input[i], " l%d %n", &op[0], &n) == 1) {
      printf("CASE l\n");
    } else if (sscanf(&input[i], " d %n", &n), n) {
      printf("CASE d\n");
    } else {
      printf("?\n");
      n = 1;
    }
    i += n;  // advance to the next unprocessed char
  }
}

输出

CASE m: -45
CASE c
CASE m: 4
CASE r
CASE m: -440
CASE l
CASE m: 5
CASE d

这假定每个操作使用固定数量的操作数。附加代码可以处理变量操作数计数。