关于读入两个字符串时出现的问题.

eleventhr 2005-12-24 04:30:48
是我在写一个字符串匹配时出现的问题.



main()
{
int i=0,j=0,p=0;
char string1[50]={0},string2[50]={0};

printf("输入第1个串,#结束:\n");
scanf("%c",&string1[i]);
while(string1[i]!='#')
{
++i;
scanf("%c",&string1[i]);
}

printf("输入第2个串,#结束:\n");
scanf("%c",&string2[j]); //问题就在这里,后面有叙述.
while(string2[j]!='#')
{
++j;
scanf("%c",&string2[j]);
}
// printf("%s",string2);
p=find(string1,string2); //我自己写的一个判定是否匹配的函数.

if(p!=0)
printf ("第二个字符串在第一个字符串中出现,从第%d个字符开始.\n",p);
else
printf("匹配失败\n");

while(1);
return 0;

}


我仔细查找后发现,string2[0]里面是'\0',而我输入的内容是从sting2[1]开始的.而对于string1不存在这样的问题.不知道是为什么.
...全文
286 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
eleventhr 2005-12-25
  • 打赏
  • 举报
回复
好方法,好方法.这样刚好就把那个'\n'给读过去了.
eleventhr 2005-12-25
  • 打赏
  • 举报
回复
看来可以结贴了,谢谢大家.
yinqingping_001 2005-12-25
  • 打赏
  • 举报
回复
每次输入数据后应清空缓冲区,否则影响下次输入结果。在两次输入之间,加fflush(stdin)即可。
eelykcaj 2005-12-25
  • 打赏
  • 举报
回复
如果你输入第一个字符串之前,回车一下,应该也会遇见同样的问题.最好屏蔽掉回车.
megaboy 2005-12-24
  • 打赏
  • 举报
回复
这是由于第一次

while(string1[i]!='#')
{
++i;
scanf("%c",&string1[i]);
}

运行后stdin里面留有一个\n而产生的问题,清除一下stdin就OK了,但最好不要使用fflush(stdin),因为fflush用在输入缓冲是未定义行为,使用while(getchar() != '\n');好一点,在scanf("%c",&string2[j]); 之前运行一下就OK了。
whyglinux 2005-12-24
  • 打赏
  • 举报
回复
>> 不好意思啊,各位, 我一不小心就打错了,string2[0]里是'\n',不好意思啊,可为什么会这样呢.

因为当以 "%c" 格式从标准输入进行 scanf() 的时候,会读入你从键盘上敲入的每一个字符,包括由于回车而产生的换行符。
hanxuaiztt 2005-12-24
  • 打赏
  • 举报
回复
不好意思啊,我想问问最后的
while(1);
return 0;
有什么用啊?
eleventhr 2005-12-24
  • 打赏
  • 举报
回复
不好意思啊,各位, 我一不小心就打错了,string2[0]里是'\n',不好意思啊,可为什么会这样呢.
liangjm_1984 2005-12-24
  • 打赏
  • 举报
回复
#include<stdio.h>

int main()
{
int i=0,j=0,p=0;
char string1[50]={0},string2[50]={0};

printf("输入第1个串,#结束:\n");
scanf("%c",&string1[i]);
while(string1[i]!='#')
{
++i;
scanf("%c",&string1[i]);
}

printf("输入第2个串,#结束:\n");
scanf("%c",&string2[j]); //问题就在这里,后面有叙述.
while(string2[j]!='#')
{
++j;
scanf("%c",&string2[j]);
}

printf("%s",string2);
/*p=find(string1,string2); //我自己写的一个判定是否匹配的函数.

if(p!=0)
printf ("第二个字符串在第一个字符串中出现,从第%d个字符开始.\n",p);
else
printf("匹配失败\n");

while(1);*/
return 0;

}





我怎么就没看出错啊
是不是你的find错了啊

在vc6.0下看的 啊
whyglinux 2005-12-24
  • 打赏
  • 举报
回复
longuby(龙骨) 在上面说的是对的,string2[0]里面不是'\0',而是'\n'。
eleventhr 2005-12-24
  • 打赏
  • 举报
回复
不好意思搞错了,是因为你去掉了string1和string2的声明,但加上后又不能编译.
eleventhr 2005-12-24
  • 打赏
  • 举报
回复
楼上的你好,我在你的程序前面加上string.h和mem.h还是显示memset没有定义,请问它是在哪个头文件里.谢谢.
sankt 2005-12-24
  • 打赏
  • 举报
回复
main()
{
int i=0,j=0,p=0;
//char string1[50]={0},string2[50]={0};
memset(string1,0,50);
memset(string2,0,50);


printf("输入第1个串,#结束:\n");
scanf("%c",&string1[i]);
while(string1[i]!='#')
{
++i;
scanf("%c",&string1[i]);
}



printf("输入第2个串,#结束:\n");
fflush(stdin); //加一句这个试试看
scanf("%c",&string2[j]);
while(string2[j]!='#')
{
++j;
scanf("%c",&string2[j]);
}
// printf("%s",string2);
p=find(string1,string2); //我自己写的一个判定是否匹配的函数.

if(p!=0)
printf ("第二个字符串在第一个字符串中出现,从第%d个字符开始.\n",p);
else
printf("匹配失败\n");

while(1);
return 0;

}
eleventhr 2005-12-24
  • 打赏
  • 举报
回复
我输入完第一个字符串后输入回车,它应该作用在第一个串上,让scanf来读入的吧.
或许它留在缓冲区让第二个scanf读入了,
关于scanf()的运行方式还请指教 .
longuby 2005-12-24
  • 打赏
  • 举报
回复
string2[0]里面的不是'\0' 是一个回车符

我感觉!!!
eleventhr 2005-12-24
  • 打赏
  • 举报
回复
我以前没有遇到过,不知道是怎么回事,DEV-C++和VC都试了,都一样.
zhousqy 2005-12-24
  • 打赏
  • 举报
回复
缓冲?

70,037

社区成员

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

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