使用C中的字符串时遇到问题。我有一个这样的字符串:
".>0and.<300"
或者
".>0 and .<280"
或者
".>=0 and .<=280"
点表示值x。我需要创建一个更简单的字符串,如:
"minimum:maximum"
例如0:300
。我尝试开始寻找<
和and
来获取值。
char *open = strrchr(string, '<');
char *end = strrchr(string, 'and');
寻求任何帮助!
答案 0 :(得分:3)
' '
。'\0'
放在最后一位数后。':'
。如果数字可能按顺序反转,您可以使用此代码(此时代码,如您所愿):
#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工具。