C语言 字符串输出时最后出现乱码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言 字符串输出时最后出现乱码相关的知识,希望对你有一定的参考价值。

//输入字符串 s1 和 s2,将它们合并为一个字符串//
#include<stdio.h>
#include<string.h>
int main()

int a,b,k;
char s1[1000],s2[1000],ex;
gets(s1); gets(s2);
a=strlen(s1);
b=strlen(s2);//计算字符串长度//
char s[a+b];
memcpy(s,s1,a);//把s1放入s中//
for(k=a;k<a+b;k++)
s[k]=s2[k-a];//把s2放入s中//
printf("s=%s\n",s);
return 0;

输入:
asdfg
zxc
输出如图,求问原因。

输出出现乱码就是因为字符串结尾并没有结尾符'\0'。
gets函数读入一行字符串时,会在最末尾自动加上'\0'结尾。但是你在for循环内将s2的字符一个个拷贝到s中的时候,循环限定条件只到了s2字符串的'\0'结尾符之前,所以输出乱码了。
将循环条件k<a+b改为k<a+b+1或者k<=a+b就可以将s2字符串最末尾的'\0'结尾符也一同赋值到s字符串的最后,输出就可以正常显示。
参考技术A #include<stdio.h>
#include<string.h>
int main()
 
int a,b,k; 
char s1[1000],s2[1000],ex; 
gets(s1);
gets(s2); 
a=strlen(s1); 
b=strlen(s2);//计算字符串长度// 
char s[a+b+1];
memcpy(s,s1,a);//把s1放入s中// 

for(k=a;k<a+b+1;k++)     

s[k]=s2[k-a];//把s2放入s中//
s[a+b]='\\0';
printf("s=%s\\n",s);

return 0;

c语言读取文件数据乱码

#include<stdio.h>
#include<stdlib.h>
#define SIZE 10
struct Student_type
int num;
char name[10];
int math;
int english;
int computer;
stud[10];
int main()
int i;
FILE*fp;
if((fp=fopen("C:\\kk\\kk.txt","rb"))==NULL)
printf("cannot open file\n");
exit(0);

for(i=0;i<SIZE;i++)
fread(&stud[i],sizeof(struct Student_type),1,fp);
printf("%d%s%d%d%d\n",stud[i].num,stud[i].name,stud[i].math,stud[i].english,stud[i].computer);

fclose(fp);
return 0;

参考代码如下:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main()

FILE *fp;
char ch;
if ((fp=fopen("o.txt","wr+"))==0) //据所知=没有"wr+"的表达,如果是读取数据的话改成if((fp = ("o.txt","r"))==NULL)就可以了
exit(0);
while(!feof(fp))
ch=fgetc(fp);
printf("%c",&ch); //改成printf("%c",ch),加上取地址符就变成读取ch的内存值了

return 0;
参考技术A 给你一个你参考下就行了

#include<iostream>
using namespace std;
void creat()//创建文件并且输入信息

int tel;
char name[20],add[20];
//char name[10];
FILE *fp;
cout<<"请输入要创建的文件的名称\\n";
cin>>name;
if((fp=fopen(name,"a+"))==NULL)

cout<<"cannot open this file\\n";
exit(0);

fprintf(fp,"%-10s%-20s%-50s\\n","姓名","电话号码","住址");
cout<<"请依次输入姓名、电话号码、住址(以0结束)\\n";
cin>>name;
while(strcmp(name,"0"))

cin>>tel>>add;
fprintf(fp,"%-10s%-20d%-50s\\n",name,tel,add);
cin>>name;

fclose(fp);

void output()//输出文件的内容

FILE *fp;
char tel[20];
char name[20],add[20];
cout<<"请输入要输出的文件的名称\\n";
cin>>name;
if((fp=fopen(name,"r"))==NULL)

cout<<"cannot open this file\\n";
exit(0);

cout<<"\\t通讯录\\n";
while(!feof(fp))

fscanf(fp,"%s%s%s\\n",name,tel,add);////一定要是%s 格式
printf("%-10s%-20s%-50s\\n",name,tel,add);

fclose(fp);



int main()

char a[20]="12";
int b= atoi(a);;//吧字符串变成数字
cout<<b;
creat();
output();
return 0;

/////或者更简单的/////////////////////////////////
///一个程序
#include<iostream>
using namespace std;
void output()//输出文件的内容

FILE *fp;
char buff[50];
char name[20];
cout<<"请输入要输出的文件的名称\\n";
cin>>name;
if((fp=fopen(name,"r"))==NULL)

cout<<"cannot open this file\\n";
exit(0);


while(!feof(fp))

fgets(buff,50,fp);
puts(buff);

fclose(fp);



int main()



output();
return 0;

参考技术B 把打开方式改为 "r"以及把读取信息用fscanf吧,因为如果你是原先先把kk.txt写好,然后再用你的程序打开它的话,由于里面有换行符以及空格等内容,除非开始你是用fwrite函数写入的结构信息,否则fread会把这些都作为信息读取的(也就是说它读到一个struct Student_type大小的数据就结束,而不管这里面到底存放的是什么,这个过程中读到的可能不是一个完整的结构的数据),所以就会出现你所说的乱码。追问

但这样一改后,文件就出现一个错误,怎么办

本回答被提问者采纳

以上是关于C语言 字符串输出时最后出现乱码的主要内容,如果未能解决你的问题,请参考以下文章

c语言输出字符串数组出现乱码

c语言如果用字符串类型输出字符数组,字符数组最后一个是0,那么为啥会出现乱码

C语言中出现乱码

c语言问题,输出结果是乱码

c语言程序输出的数据后面多了一些乱码

C语言文件输出时,输入数据后为啥会出现乱码