关于C语言字符串字面量、数组与char*指针的技术疑问
C语言回文判断相关问题解答
为什么strrev用不了?
strrev不是C标准库函数,只是部分编译器(比如微软MSVC)提供的非标准扩展。CodeSignal的IDE大概率用的是遵循C标准的编译器(比如GCC),所以不认这个函数。你自己写的双指针对比方案是标准C实现,兼容性拉满,完全靠谱。
字符串字面量和字符数组的区别
虽然所有字符串都是'\0'结尾的字符序列,但这俩本质上有区别:
- 字符数组:比如
char arr[] = "test";,这是在栈或全局区分配一块连续内存,把字符串内容复制进去,你可以随意修改数组里的字符(比如arr[0] = 'T'完全合法)。 - 字符串字面量:比如
char* p = "test";,这里的"test"存在程序的只读数据段里,属于常量,你不能修改它的内容(硬改会触发未定义行为,轻则崩溃,重则出现奇怪问题)。它存在的意义:- 简化代码:直接写字面量比手动初始化数组省事得多。
- 节省内存:相同的字面量在程序中只会存储一份,多个指针可以指向它,避免重复占用空间。
char* inputString是数组还是指针?
char* inputString就是个指针变量,它存储的是字符数组(或字符串字面量)的首地址,本身并不是数组。
- 当你把字符数组传给函数时,数组会自动“退化”成指向第一个元素的指针,所以函数里的
inputString拿到的是数组首字符的地址。 - 你能用
inputString[i]访问元素,这是C语言的语法糖,本质和*(inputString + i)一样,都是通过指针偏移来访问内存中的字符。
挑战原题与实现代码
挑战原题
给定一个字符串,判断它是否为回文。
实现代码(修正版)
bool solution(char * inputString) { // 输入为字符数组,每个位置存单个字符,末尾以'\0'终止 // inputString是指针,存储输入字符串的内存地址 // 补充:inputString指向的是从索引0开始的数组对象 // 函数返回布尔类型(1表示真,默认0表示假) int begin = 0; // 原代码漏了初始化,必须设为0,否则是随机值会出错 int end = strlen(inputString) - 1; // 最后一个元素的索引是字符串长度减1,因为索引从0开始计数 while (end > begin) { if (inputString[begin++] != inputString[end--]) { return 0; } } return 1; }
注意:原代码里begin没有初始化,会导致未定义行为,一定要补上begin = 0。
内容的提问来源于stack exchange,提问作者generateGeorgina
相关产品推荐
相关产品推荐

