如何比较C字符串中的子字符串和解析数字

时间:2015-04-02 19:05:27

标签: c string

我是低级编程的新手,并且遇到了以下问题:

我得到一个以下格式的字符串:

?cmd=ASET&<hour>&<minute>

其中小时和分钟值始终由2个十进制数组成。 因此,可以接收的字符串示例是:

"?cmd=ASET&08&30"

我正在尝试编写一个if语句,该语句识别该字符串以“?cmd = ASET”开头,并将名为minute和hour的两个全局变量更改为String中的值。我一直试图用strtok()来做这件事,但到目前为止还没有运气。所以我的if语句的全局布局是:

if (String starts with "?cmd=ASET") {
   minute = value found in the string;
   hour = value found in the string;
}

我真的很感激任何帮助。

3 个答案:

答案 0 :(得分:4)

尝试类似这样的事情,其中​​cmd是char *或char []类型变量。请注意,strncmp()strcmp()更安全。通常,在C编程中,您希望使用限制长度的函数变体,以避免堆栈溢出攻击和其他安全风险。如果给定输入错误,字符串到数字函数可能会失败,最好使用可以检查其状态的表单,这就是不推荐使用atoi()atol()的原因。 sscanf()允许像strtol()一样检查状态,因此它们都可以接受。

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

int
main() 
{
   char *string = "?cmd=ASET&12&30";
   #define ASET_CMD "?cmd=ASET"
   int hour = 0, minute = 0;
   if (strncmp(string, ASET_CMD, strlen(ASET_CMD)) == 0) {
       if (sscanf(string + strlen(ASET_CMD), "&%d&%d", &hour, &minute) != 2)  {
          printf("Couldn't parse input string");
          exit(EXIT_FAILURE);
       }
   }
   printf("hour: %d, minute: %d\n", hour, minute);
   return(EXIT_SUCCESS);
}

$ cc -o prog prog.c
$ ./prog
hour: 12, minute: 30

答案 1 :(得分:1)

如果sscanf()可用于OP,请考虑:

unsigned hour, minute;
int n;
int cnt = sscanf(buffer, "?cmd=ASET&%2u&%2u%n", &hour, &minute, &n);
if (cnt == 2 && buffer[n] == 0) Success();
else Failure();
如果前缀匹配,则

cnt的值为2,找到2个数字 n检测字符串中是否存在任何附加字符。

答案 2 :(得分:0)

有一个函数atoi(),它从string返回整数。
你可以像那样解析字符串

char string[16];
strcpy(string, "?cmd=ASET&08&30");
if (String starts with "?cmd=ASET") {
   hour = atoi(string+10);
   minute = atoi(string+13);
}

其中+10表示小时,+ 13表示分钟 这是一个有效的例子:

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

int main ()
{
    int hour, minute;
    char string[16];
    strcpy(string, "?cmd=ASET&08&30");

    /* Check if string contains ?cmd=ASET */
    if (strstr(string, "?cmd=ASET") != NULL) 
    {
        /* Parse minute and hour */
        hour = atoi(string+10);
        minute = atoi(string+13);

        /* Print output */
        printf("Minute: %02d \nHour: %02d\n", minute, hour);
    }
}