使用 const char 组织字符串

Posted

技术标签:

【中文标题】使用 const char 组织字符串【英文标题】:Using const char to organize strings 【发布时间】:2021-12-26 02:36:54 【问题描述】:

我正在尝试按字母顺序对这些预先确定的字符串进行排序,但我的 strcmp 和 strcpy 说我的 const char* 被函数中使用的 char* 违反了。

这是代码;

#include <stdio.h>
#include <string.h>
#define size 10

int main(void) 
    const char* cities[size] =  "Acushnet", "Dartmouth", "Fairhaven", 
            "Fall River", "Freetown", "Marion", 
            "Mattapoisett", "New Bedford", "Rochester", "Westport" ;
    //using values a and b to hold values
    int a;
    const char b;
    for (int i = 0; i < size; i++) 
        for (int a = i + 1; a <= size; a++) 
            if (strcmp(cities[i], cities[a]) > 0) 
                strcpy(b, cities[i]);
                strcpy(cities[i], cities[a]);
                strcpy(cities[a], b);
            
        
    

【问题讨论】:

您收到的strcpy 警告是正确的。 cities 是一个指向常量字符串的指针数组。将这些用作strcpy 的第一个(目标)参数会尝试违反constness。另一种方法是交换指针而不是字符串值本身。 【参考方案1】:

strcpy 期望 char * 用于第一个参数,const char * 用于第二个参数。 b 不是这些,而是​​const char。此外,由于您的数组成员的类型为 const char *,因此它们不能作为第一个参数传递给 strcpy

由于你有一个指针数组,你只需要交换指针本身,而不是它们指向的内容。

        if (strcmp(cities[i], cities[a]) > 0) 
            const char *tmp = cities[i];
            cities[i] = cities[a];
            cities[a] = tmp;
        

【讨论】:

【参考方案2】:

变量b 的类型为const char

const char b;

所以这个函数调用strcpy

strcpy(b, cities[i]);

没有意义,因为函数的第一个参数必须具有char * 类型。您需要交换表示指针数组元素的指针。

此外这个for循环

for (int a = i + 1; a <= size; a++) 

a 等于size 时,可能会导致访问数组cities 之外的内存,因为索引的有效范围是[0, size)..

您需要将变量b 声明为具有const char * 类型作为数组元素的类型。

const char *b;

至少按以下方式编写 for 循环

for (int i = 0; i < size; i++) 
    for ( int a = i + 1; a < size; a++) 
        if ( strcmp(cities[i], cities[a]) > 0) 
            b = cities[i];
            cities[i] = cities[a];
            cities[a] = b;
        
    

这是一个演示程序。

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

int main( void ) 

    const char* cities[] = 
     
        "Acushnet", "Dartmouth", "Fairhaven", "Fall River", "Freetown", "Marion", 
        "Mattapoisett", "New Bedford", "Rochester", "Westport" 
    ;
    
    const size_t size = sizeof( cities ) / sizeof( *cities );
    
    for ( size_t i = 0; i < size; i++ )
    
        for ( size_t j = i + 1; j < size; j++ )
        
            if ( strcmp( cities[j], cities[i] ) < 0 )
            
                const char *tmp = cities[i];
                cities[i] = cities[j];
                cities[j] = tmp;
            
        
    
    
    for ( size_t i = 0; i < size; i++ )
    
        printf( "\"%s\" ", cities[i] );
    
    putchar( '\n' );
    
    return 0;

程序输出是

"Acushnet" "Dartmouth" "Fairhaven" "Fall River" "Freetown" "Marion" "Mattapoisett" "New Bedford" "Rochester" "Westport" 

【讨论】:

以上是关于使用 const char 组织字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何将 const char * 数组项添加到 const char * 字符串?

请问C语言如何把2个const char * const s1的字符串合并?

将标记转换为 char* const* 时,使用 boost 标记字符串失败

您可以从`volatile const char *`构造一个字符串吗? (不使用`const_cast`)

C++标准库 如何连接两个const char *类型字符串,并返回const char * 类型结果?

声明“constexpr char*”字符串时是不是强制使用 const 关键字?