You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 20:36:04