请阅读【嵌入式开发学习必备专栏 】
文章目录
- 判断一个字符串是否是数值字符串
判断一个字符串是否是数值字符串
为了判断一个字符串是否是数值字符串,包括十进制和十六进制,可以实现一个函数is_numeric_string
。在这个函数中,将遵循以下步骤:
- 首先,检查字符串是否为空。如果是,返回
-1
。 - 然后,检查字符串的第一个字符。如果是
'-'
或'+'
,则跳过它,因为数值字符串可以是正数或负数。 - 对于十六进制数,字符串可能以
"0x"
或"0X"
开始。如果检测到这个前缀,将验证其余字符是否都是有效的十六进制数字(0-9
,a-f
或A-F
)。 - 如果没有检测到十六进制前缀,将验证字符串中的每个字符是否都是有效的十进制数字(
0-9
)。
下面是根据上述步骤实现的is_numeric_string
函数:
#include <stdio.h>
#include <string.h>
#include <ctype.h>// 函数声明
int is_numeric_string(char *s);int main(void)
{// 测试函数printf("%d\n", is_numeric_string("12345")); // 应该返回 0printf("%d\n", is_numeric_string("-12345")); // 应该返回 0printf("%d\n", is_numeric_string("0x1A3E")); // 应该返回 0printf("%d\n", is_numeric_string("0XABCDEF")); // 应该返回 0printf("%d\n", is_numeric_string("123.456")); // 应该返回 -1printf("%d\n", is_numeric_string("abcdef")); // 应该返回 -1return 0;
}int is_numeric_string(char *s)
{if (s == NULL || *s == '\0') return -1; // 检查空指针和空字符串// 跳过正负号if (*s == '+' || *s == '-') s++;// 检查十六进制前缀if (*s == '0' && (*(s + 1) == 'x' || *(s + 1) == 'X')) {s += 2; // 跳过 "0x" 或 "0X"if (*s == '\0') return -1; // 如果只有"0x"或"0X",没有数字,则不是有效的数值字符串for (; *s; s++) {if (!isxdigit((unsigned char)*s)) return -1; // 检查是否是十六进制数字}} else {// 检查十进制数字for (; *s; s++) {if (!isdigit((unsigned char)*s)) return -1; // 检查是否是十进制数字}}return 0; // 是数值字符串
}
该函数通过检查字符串中的每个字符来确定它是否符合数值字符串的格式要求。如果字符串符合十进制或十六进制数值字符串的格式,函数返回0
;否则返回-1
。