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

C语言截取fgets输入字符串前两位出现乱码如何解决?

问题根因
  • C语言中字符串必须以\0(空终止符)作为结束标识,printf读取%s格式的字符串时,会从传入的起始地址持续读取字符,直到遇到\0才会停止输出。
  • 你使用strncpy仅复制了前2个字符,该函数不会在复制长度不足时自动追加\0终止符。而你定义的nama2、alamat2等目标数组属于局部变量,未初始化时内存中存储的是随机垃圾值,输出时就会把终止符前的所有内容都打印出来,出现乱码。
  • 代码中的fflush(stdin)属于无效操作,C标准规定fflush仅对输出流的行为有明确定义,对输入流stdin操作属于未定义行为,且此处逻辑和输入缓冲区没有关联,完全多余。
修复方案
  1. 每次调用strncpy复制2个字符后,手动给目标数组下标为2的位置赋值\0,手动补充字符串终止符。
  2. 删除所有无用的fflush(stdin)语句。
  3. 可选优化:定义数组时直接初始化为全0,避免未初始化内存的垃圾值干扰。
修复后核心代码片段
strncpy(nama2,nama,2);
nama2[2] = '\0';
strncpy(alamat2,alamat,2);
alamat2[2] = '\0';
strncpy(kota2,kota,2);
kota2[2] = '\0';
完整修复后代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
 char nama[20],alamat[30],kota[20],jenis_kelamin[2];
 char nama2[4] = {0},alamat2[4] = {0},kota2[4] = {0}; // 初始化全0避免垃圾值
 int nomor;

 printf("Enter your name                                   = ");
 fgets(nama,20,stdin);
 printf("Nama                                              = %s\n",nama);

 printf("Enter your address                                = ");
 fgets(alamat,30,stdin);
 printf("Alamat                                            = %s\n",alamat);

printf("Enter your city name                               = ");
fgets(kota,20,stdin);
printf("Kota                                              = %s\n",kota);

printf("Masukkan Jenis Kelamin Anda Dengan Huruf L atau P = ");
fgets(jenis_kelamin,2,stdin);
printf("Kelamin                                           = %s\n",jenis_kelamin);

printf("\nMasukkan Nomor NIM                                = ");
scanf("%d",&nomor);
printf("Nomor                                             = %d\n",nomor);

printf("\n*******************************************************\n");
printf(" Your name is                   * %s",nama);
printf(" Your address is                * %s",alamat);
printf(" Your cith name is              * %s",kota);
printf(" Jenis Kelamin anda adalah      * %s\n",jenis_kelamin);
printf(" Nomor NIM anda adalah          * %d ",nomor);
printf("\n*******************************************************\n");

strncpy(nama2,nama,2);
nama2[2] = '\0';
strncpy(alamat2,alamat,2);
alamat2[2] = '\0';
strncpy(kota2,kota,2);
kota2[2] = '\0';

printf(" 2 First Character of your Name* %s\n",nama2);
printf(" 2 First Character of your Address* %s\n",alamat2);
printf(" 2 First Character of your City* %s",kota2);
printf("\n*******************************************************\n");

return 0;
}

内容的提问来源于stack exchange,提问作者FinnnIT

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 18:24:10