C语言获取字符串指定索引位置字符返回子串问题
问题根因
你对C风格字符串和printf的传参逻辑理解有偏差:
- C语言里的字符串是以
'\0'作为结束标记的连续char内存块,printf的第一个参数要求是格式字符串指针,传入char*类型指针后,函数会从指针指向的内存位置开始逐字节向后读取字符输出,直到碰到'\0'才停止。 - 你代码里写的
&S[1]等价于S + 1,是指向字符串索引1位置(测试用例里对应字符'e')内存地址的指针,不是单个字符本身。printf拿到这个指针后,会从'e'开始一直输出到字符串结尾,自然就得到了"est",而非你预期的单个'e'。 - 额外提醒:你声明的函数返回值类型是
char*,但函数内部没有写return语句,这属于未定义行为,运行时可能出现不可预期的问题。
修正方法
根据你的实际需求选对应写法即可:
- 仅打印指定索引的单个字符:用
%c格式符明确告诉printf输出目标是单个char类型值,不要对S[1]取地址,同时因为不需要返回值,把函数返回值类型改成void:
传入"Test"调用该函数,就会输出你预期的字符"e"。#include <stdio.h> void test(char *S) { printf("%c", S[1]); } - 需要函数返回指定索引的单个字符:把函数返回值类型从
char*(字符串指针)改成char(单个字符类型),补充返回逻辑:
拿到函数返回值后,用char test(char *S) { return S[1]; }%c格式符打印即可得到单个字符。
内容的提问来源于stack exchange,提问作者TedJH
相关产品推荐
相关产品推荐

