【发布时间】:2016-10-14 05:01:39
【问题描述】:
如何在不使用 C 库函数的情况下比较 2 个字符串?例如,我对如何编码“土豚”“大于”“沼泽”感到困惑。我需要通过比较它们的字符对二维字符串数组进行冒泡排序......这是我的问题。我是否使用 strlen() 比较字符串长度然后比较字符?请帮忙,因为我有点困惑。谢谢
【问题讨论】:
如何在不使用 C 库函数的情况下比较 2 个字符串?例如,我对如何编码“土豚”“大于”“沼泽”感到困惑。我需要通过比较它们的字符对二维字符串数组进行冒泡排序......这是我的问题。我是否使用 strlen() 比较字符串长度然后比较字符?请帮忙,因为我有点困惑。谢谢
【问题讨论】:
使用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 并打印它。
【讨论】:
我认为你应该学习 Lexicalgraphic Order 来编写你自己的字符串比较。 http://mathworld.wolfram.com/LexicographicOrder.html
【讨论】:
怎么样:
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 是等效字符串则为零。
作为关于可移植性的关注点,例如,C 标准不保证与'b' 关联的数值大于与'a' 关联的数值。实际上,对于大多数人来说,这并不是一个真正的问题。但是,有时会发现其他编码方案,例如 EBCDIC(在旧的 IBM 大型机上)。对于 ASCII 值,我们将有 mystrcmp("Aardvark", "aardvark") --> 32,即大写字母在小写字母之前。但是对于 EBCDIC 值,我们将拥有 mystrcmp("Aardvark", "aardvark") --> -64,因为在此方案中,大写字母跟随小写字母。有here和here讨论这个问题。
【讨论】: