我是低级编程的新手,并且遇到了以下问题:
我得到一个以下格式的字符串:
?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;
}
我真的很感激任何帮助。
答案 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);
}
}