C中的字符串替换

时间:2014-05-07 06:31:16

标签: c string substring

使用C中的字符串时遇到问题。我有一个这样的字符串:

".>0and.<300"

或者

".>0 and .<280"

或者

".&gt;=0 and .&lt;=280"

点表示值x。我需要创建一个更简单的字符串,如:

"minimum:maximum"

例如0:300。我尝试开始寻找<and来获取值。

char *open = strrchr(string, '<');
char *end = strrchr(string, 'and');

寻求任何帮助!

2 个答案:

答案 0 :(得分:3)

  1. 将所有非数字字符替换为' '
  2. 一开始修剪空格。
  3. 修剪数字之间的空格,只留一个。
  4. '\0'放在最后一位数后。
  5. 将一个空格替换为':'
  6. 如果数字可能按顺序反转,您可以使用此代码(此时代码,如您所愿):

    #include <string.h>
    #include <stdio.h>
    
    #define MIN(a,b) (((a)<(b))?(a):(b))
    #define MAX(a,b) (((a)>(b))?(a):(b))
    
    int main()
    {
      char src[] = ".>1220and.<300";
      char dstBuf[64]="ERROR";
      char* num1 = NULL;
      char* num2 = NULL;
      char* ptr = src;
      int indigit = 0;
    
      for (;*ptr; ptr++) {
        if (isdigit(*ptr)) {
          if (indigit == 0) {
            if (num1 == NULL) num1 = ptr;
            else              num2 = ptr;
            indigit = 1;
          }
        } else {
          indigit = 0;
        }
      }
      if (num1 != NULL && num2 != NULL) {
        int n1 = strtoll(num1, NULL, 10);
        int n2 = strtoll(num2, NULL, 10);
        sprintf(dstBuf, "%d:%d", MIN(n1,n2), MAX(n1,n2));
      } else if (num1 != NULL) {
        sprintf(dstBuf, "%s", num1);
      }
    
      printf("%s\n", dstBuf);
    
    }
    

答案 1 :(得分:0)

如何找到这两个数字并用最小和最大值排序?

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

#define MIN(a,b) (((a)<(b))?(a):(b))
#define MAX(a,b) (((a)>(b))?(a):(b))

int main(){
    char s[] = ".>=0 and .<=280";
    char *ptr = s;
    int a, b;

    while( ! isdigit(*ptr)) ptr++;
    a = atoi(ptr);
    while(isdigit(*ptr)) ptr++;
    while( ! isdigit(*ptr)) ptr++;
    b = atoi(ptr);

    printf("%d:%d\n", MIN(a, b), MAX(a, b));

    return 0;
} 

请注意,我的代码假定字符串格式正确,您应该为真实内容添加安全检查。

修改

这是一个非常基本的解析器,可以处理所有情况,并进行一些安全检查。

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

int main(){
    char s[] = ".>=0 and .<=280";
    char *ptr = s;
    int num;
    unsigned char equals, gt, lt;

    while(*ptr){
        /* consume the stuff before the digit */
        equals = gt = lt = 0;
        while(*ptr && ! isdigit(*ptr)){
            switch(*ptr){
                case '=':
                    equals = 1; break;
                case '<':
                    lt = 1; break;
                case '>':
                    gt = 1; break;
            }
            ptr++;
        }
        /* consume the digit */
        num = atoi(ptr);
        while(*ptr && isdigit(*ptr)) ptr++;

        /* do your stuff according to (gt, lt, equals, num) */
        printf("found comparison: gt=%d lt=%d equals=%d num=%d\n", gt, lt, equals, num);
    }

    return 0;
}

以下是它的工作原理:

$ ./test 
found comparison: gt=1 lt=0 equals=1 num=0
found comparison: gt=0 lt=1 equals=1 num=280

如果你的需求变得比这更复杂,你应该真正看看正确的解析和lexing工具。