如何在不使用C库函数的情况下比较2个字符串?我对如何编码" aardvark"感到困惑。是"大于" "沼泽"例如。我需要通过比较它们的字符来对二维字符串数组进行冒泡...这是我的问题。我是否使用strlen()比较字符串长度然后比较字符?请帮助,因为我有点困惑。感谢
答案 0 :(得分:2)
使用strcmp("aardvark","bog");
如果它们相同则返回0,如果aardvark小于bog(它是)则返回负数,如果它更大则返回正数。
以下是文档的链接:
http://www.cplusplus.com/reference/cstring/strcmp/
方式"小于"或者"大于"计算不依赖于字符串长度,而是依赖于ASCII表。 A小于b,因此aardvark不到bog。蝾螈比沙拉更大,因为它们直到m / d字符匹配,直到你比较m和d。 M来自d。如果蝾螈是你的第一个参数而沙拉是第二个,那么它会返回一个正数。
如果出于某种原因,你真的不能使用c库函数,你可以通过将字符串逐字符比较来重新发明轮子。
类似于以下内容:
int compare(char* a, char* b)
{
assert(a!=NULL&&b!=NULL);
int i = 0;
while ( a[i] != '\0' )
{
if( b[i] == '\0' ) { return 1; }
else if( a[i] < b[i] ) { return -1; }
else if( a[i] > b[i] ) { return 1; }
i++;
}
if(b[i]=='\0')
return 0;
else
return -1;
}
同样,这里我使用的是比小于和大于比较单个字符,因为它们包含ASCII标准定义的整数值。
要查看我在说什么,请尝试将字符转换为int并打印它。
答案 1 :(得分:1)
我认为你应该学习Lexicalgraphic Order来编写你自己的字符串比较。 http://mathworld.wolfram.com/LexicographicOrder.html
答案 2 :(得分:0)
怎么样:
int mystrcmp(char *s1, char *s2)
{
int i = 0;
int c1, c2, ret_val = 0;
while ((c1 = s1[i]) && (c2 = s2[i]) && (ret_val = c2 - c1) == 0)
i++;
if (ret_val)
return ret_val;
else if (c1 == '\0')
c2 = s2[i];
return c2 - c1;
}
使用两个字符串s1
和s2
中的字符的整数值(可能是ASCII或UTF-8值),如果s1
先于s2
,则此函数返回正整数s2
,如果s1
位于s1
之前,则为负值,如果s2
和'b'
为等效字符串,则为零。
作为关于可移植性的关注点,例如,C标准不保证与'a'
相关联的数值大于与mystrcmp("Aardvark", "aardvark") --> 32
相关联的数值。实际上,对大多数人来说,这不是一个真正的问题。但是,还有其他编码方案,例如EBCDIC,有时会发现(例如旧的IBM大型机)。对于ASCII值,我们将mystrcmp("Aardvark", "aardvark") --> -64
,即大写字母在小写字母之前。但是对于EBCDIC值,我们会tabularcolumns
,因为在这个方案中大写字母遵循小写字母。有关此问题的讨论here和here。