你好我比较了两个包含数字的char *变量的问题
char1 = "999999"
和char2="11111111"
当我使用strcmp
函数时,它将返回char1变量大于char2
甚至错了。
(我知道我可以比较使用atoi函数直到字符串中的9个字符,但我需要使用10这样才能减少这种可能性。)
答案 0 :(得分:4)
实际上,这是对的。它正在对字符串的内容进行字符串比较,而不是数字字符串。
作为一个快速而肮脏的黑客,假设您已经验证字符串包含正整数,您可以执行以下操作:
if (strlen(char2) > strlen(char1)) {
// char2 > char1
} else if (strlen(char2) == strlen(char1)) {
cmp = strcmp(char2, char1);
if (cmp > 0) {
// char2 > char 1
} else if (cmp == 0) {
// char2 == char1
} else {
// char2 < char1
}
} else {
// char2 < char1
}
答案 1 :(得分:4)
避免atoi
和朋友的一种稍微麻烦的方法是用零填充两个字符串中较短的一个。或者,假设没有前缀零,只需首先比较长度(因为较短的字符串必须具有较低的值),然后运行lexiographic比较:
int numerical_strcmp(const char* a, const char* b) {
return (strlen(a) != strlen(b)) ? ((strlen(a) > strlen(b)) ? 1 : -1) : strcmp(a, b);
}
哦,这需要字符串包含非负数。
答案 2 :(得分:3)
如果字符串没有前导/尾随垃圾,请使用此算法:
strlen()
比较两个字符串的长度。较长的一个总是最大的。strcmp()
。答案 3 :(得分:1)
您可以使用_atoi64
将字符串转换为64位整数。然后,您可以按照您的预期直接比较它们。根据您的编译器,_atoi64
可能被称为不同的东西。
答案 4 :(得分:1)
最短路应该是:
int mystrcmp(const char *a,const char *b)
{
return strlen(a)-strlen(b)?strlen(a)-strlen(b):strcmp(a,b);
}
答案 5 :(得分:0)
按字面顺序排序,这意味着从9开始的东西总是大于从1开始的东西。如果你需要进行整数比较,你将不得不使用atoi。