C语言截取fgets输入字符串前两位出现乱码如何解决?
问题根因
- C语言中字符串必须以
\0(空终止符)作为结束标识,printf读取%s格式的字符串时,会从传入的起始地址持续读取字符,直到遇到\0才会停止输出。 - 你使用
strncpy仅复制了前2个字符,该函数不会在复制长度不足时自动追加\0终止符。而你定义的nama2、alamat2等目标数组属于局部变量,未初始化时内存中存储的是随机垃圾值,输出时就会把终止符前的所有内容都打印出来,出现乱码。 - 代码中的
fflush(stdin)属于无效操作,C标准规定fflush仅对输出流的行为有明确定义,对输入流stdin操作属于未定义行为,且此处逻辑和输入缓冲区没有关联,完全多余。
修复方案
- 每次调用
strncpy复制2个字符后,手动给目标数组下标为2的位置赋值\0,手动补充字符串终止符。 - 删除所有无用的
fflush(stdin)语句。 - 可选优化:定义数组时直接初始化为全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
相关产品推荐
相关产品推荐

