Dev-C++ 处理字符串时出现乱码,是因为什么呢?????

anz130 2011-05-26 04:23:49
请教各位,我在Dev c编译器里运行一程序,为什么会在显示的最后多个字符(乱码)呢?
而且最郁闷的是,在网上碰到一朋友说他的不显示乱码,现把代码:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int FString(char src[],char obj[],int flag)
{
int i=0,j=0;
int clag=0;
int k=0;
for(i=0;i<strlen(src);i++)
{
if((src[i]==' '&&src[i+1]!=' ')&&(clag<=1))
{
clag++;
}
if(clag<=1)
{
if(clag<1)
obj[j++]=src[i];
else
{
if(k<=flag)
obj[j++]=src[i];
k++;
}
}
}
return 0;
}


int main()
{

char a[100]={"1234303 63.50345 12345 1"};
char b[100];
FString(a,b,4);
if(b==" ")
puts("error string\n");
printf("b:%s\n",b);
system("pause");
return 0;
}
目的是想显示出:1234303 63.5
但是实际却是:1234303 63.5> 这个弄了一个下午了,不知道是哪里错了,请告诉下解决方法。。。。
...全文
535 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
anz130 2011-05-26
  • 打赏
  • 举报
回复
谢谢各位的回答,因为分不多,所以就只能不好意思了,,但是还是谢谢大家的回答。。。
cqltwslt 2011-05-26
  • 打赏
  • 举报
回复
啊,偶也是菜鸟啊,也不是很清楚,只是以前遇到过,sorry~~无奈中
shi3590 2011-05-26
  • 打赏
  • 举报
回复
不知道你想干什么,是要在主串中找出按可控数量空格的字串并返回么?
那你这个还得改,功能并没有实现,不过还是贴上我给你改的代码,自己根据需求在改吧。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int FString(char *src,char *obj,int flag)
{
int i=0,j=0;
int clag=0;
int k=0;
for(i=0;i<strlen(src);i++)
{
if((src[i]==' '&&src[i+1]!=' ')&&(clag<=1))
{
clag++;
}
if(clag<=1)
{
if(clag<1)
obj[j++]=src[i];
else
{
if(k<=flag)
{
obj[j++]=src[i];
k++;
clag=0;
}
else
{
obj[j]='\0';
break;
}
}
}
}

return 0;
}


int main()
{

char a[100]={"1234303 63.50345 12345 123 145 1456 134"};
char b[100];
memset(b,0x00,sizeof(b)); //注意初始化
FString(a,b,4);
if(b==" ")
puts("error string\n");
printf("b:%s\n",b);
system("pause");
return 0;
}
东莞某某某 2011-05-26
  • 打赏
  • 举报
回复
就是说,解析字符串的时候,编译器会一直偏移下去,直到遇到存放'\0'的内存单元,而不管此时是否越界
东莞某某某 2011-05-26
  • 打赏
  • 举报
回复
数组的界限只是对程序员的约定,编译器对a[i]解析的时候,先得到a的首地址,然后偏移i*元素大小。

anz130 2011-05-26
  • 打赏
  • 举报
回复
谢谢 cqltwslt 问题已经解决,但是可以说明下为什么要加obj[j]='\0'吗?
不是说字符串的最后会默认加'\0'的吗??

难道之前就是因为没'\0'而产生乱码了吗???
cqltwslt 2011-05-26
  • 打赏
  • 举报
回复
找到了!!一点小问题吧!!仅供参考:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int FString(char src[],char obj[],int flag)
{
int i=0,j=0;
int clag=0;
int k=0;
for(i=0;i<strlen(src);i++)
{
if((src[i]==' '&&src[i+1]!=' ')&&(clag<=1))
{
clag++;
}
if(clag<=1)
{
if(clag<1)
obj[j++]=src[i];
else
{
if(k<=flag)
obj[j++]=src[i];
k++;
}
}
} obj[j]='\0'; /*这里加上这句代码,说明结束否则会有乱码*/
return 0;
}


int main()
{

char a[100]={"1234303 63.50345 12345 1"};
char b[100];
FString(a,b,4);
if(b==" ")
puts("error string\n");
printf("b:%s\n",b);
system("pause");
return 0;
}
bdmh 2011-05-26
  • 打赏
  • 举报
回复
你应该控制i在 数组长度-1 之内,你在for循环中做这个判断
anz130 2011-05-26
  • 打赏
  • 举报
回复
那应该怎么预防呢??/或者说怎么解决呢??

我在VC++下编译也是乱码了,
bdmh 2011-05-26
  • 打赏
  • 举报
回复
src[i+1]这个就很危险,当i到了最后一个时,那么i+1可就越界了

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧