【问题标题】:Using const char to organize strings使用 const char 组织字符串
【发布时间】: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。另一种方法是交换指针而不是字符串值本身。

标签: c sorting swap c-strings selection-sort


【解决方案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" 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-21
      • 1970-01-01
      • 2020-01-03
      • 1970-01-01
      • 1970-01-01
      • 2013-10-22
      • 1970-01-01
      相关资源
      最近更新 更多