使用strncpy取字符串首字符得到空字符串是什么原因?
代码问题梳理
代码存在三个核心错误:
- 数组空间分配错误:
char c[] = ""初始化得到的字符数组长度仅为1字节,仅能存储字符串结束符\0。调用strncpy(c, s, 1)时,会将s的首字符写入这唯一的1字节空间,直接覆盖原本的\0;且strncpy在指定拷贝长度小于等于源字符串长度时,不会自动追加\0,最终c既不是合法的C字符串,也没有多余空间存储结束符。 - printf格式符使用错误:代码中用
%c格式符输出c属于未定义行为:c是字符数组名,本质是指向数组首地址的指针,而%c要求传入的参数是char类型的字符值,此处输出结果完全不可预期。如果要输出c存储的第一个字符,正确写法为printf("%c\n", c[0])或printf("%c\n", *c)。 - strncpy使用场景不当:如果仅需要获取字符串的第一个字符,不需要调用字符串拷贝函数,直接通过下标取值即可:
char c = s[0];就能满足需求,无需额外定义字符数组存储。
修正后可运行代码示例
#include <stdio.h> #include <string.h> int main() { char s[] = "abcdefghi"; // 方案1:直接取单个字符,最简便 char c = s[0]; printf("取到的首字符:%c\n",c); printf("原字符串:%s\n",s); // 方案2:如果需要用字符串形式存储首字符 char c_str[2] = ""; // 分配2字节空间,1个存字符,1个存结束符 strncpy(c_str, s, 1); c_str[1] = '\0'; // 手动补结束符,保证是合法字符串 printf("字符串形式存储的首字符:%s\n",c_str); printf("原字符串无变化:%s\n",s); return 0; }
内容的提问来源于stack exchange,提问作者ilyes bouzidi
相关产品推荐
相关产品推荐

