使用 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
的第一个(目标)参数会尝试违反const
ness。另一种方法是交换指针而不是字符串值本身。
【参考方案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`)