【问题标题】:strcmp() and signed / unsigned charsstrcmp() 和有符号/无符号字符
【发布时间】:2009-08-31 09:59:37
【问题描述】:

我对 strcmp() 感到困惑,或者更确切地说,它是如何由标准定义的。考虑比较两个字符串,其中一个字符串包含 ASCII-7 范围 (0-127) 之外的字符。

C 标准定义:

int strcmp(const char *s1, const char *s2);

strcmp函数将s1指向的字符串与字符串进行比较 由 s2 指向。

strcmp 函数返回一个大于、等于或 小于零,因此作为 s1 指向的字符串更大 小于、等于或小于 s2指向的字符串。

参数为char *。不是 unsigned char *。没有“比较应该作为unsigned”的概念。

但我检查的所有标准库都认为“高”字符就是这样,比 ASCII-7 字符的值更高

我知道这是有用的,也是预期的行为。我不想说现有的实现是错误的或什么的。我只是想知道,我错过了标准规范中的哪些部分

int strcmp_default( const char * s1, const char * s2 )
{
    while ( ( *s1 ) && ( *s1 == *s2 ) )
    {
        ++s1;
        ++s2;
    }
    return ( *s1 - *s2 );
}

int strcmp_unsigned( const char * s1, const char *s2 )
{
    unsigned char * p1 = (unsigned char *)s1;
    unsigned char * p2 = (unsigned char *)s2;

    while ( ( *p1 ) && ( *p1 == *p2 ) )
    {
        ++p1;
        ++p2;
    }
    return ( *p1 - *p2 );
}

#include <stdio.h>
#include <string.h>

int main()
{
    char x1[] = "abc";
    char x2[] = "abü";
    printf( "%d\n", strcmp_default( x1, x2 ) );
    printf( "%d\n", strcmp_unsigned( x1, x2 ) );
    printf( "%d\n", strcmp( x1, x2 ) );
    return 0;
}

输出是:

103
-153
-153

【问题讨论】:

  • ...这与这个问题有关,因为...?

标签: c standards


【解决方案1】:

7.21.4/1 (C99),重点是我的:

比较函数 memcmp、strcmp、 strncmp 由第一个值之间的差异的符号确定 对象不同的一对字符(都解释为无符号字符) 比较。

C90 中也有类似的东西。

请注意,strcoll() 可能比 strcmp() 更适合,特别是如果您有基本字符集之外的字符。

【讨论】:

  • 优秀。正是我一直在寻找的那种答案。谢谢!
猜你喜欢
  • 2019-01-15
  • 2014-01-28
  • 1970-01-01
  • 2010-09-30
  • 1970-01-01
  • 1970-01-01
  • 2021-10-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多