dnf全面开战总攻:高手帮我看看这段C程序

来源:百度文库 编辑:杭州交通信息网 时间:2024/04/28 05:36:46
程序作用:找出一段字符中最长的单词
运行的时候刚开始运行可以,多运行几次就出问题了,不知道怎么回事。我用的是TC2.0

void lword(char str1[],char str2[])
{
int i=0,j=0,k=0;
char str[100];
while (str1[i]!='\0' && str1[i]!=' ')
{
str2[j++]=str1[i++];
}
str2[j]='\0'; i++;
do
{
j=0;
while(str1[i]!='\0' && str1[i]!=' ')
{
str[j]=str1[i];i++;j++;
}
str[j]='\0';i++;
if (strlen(str)>strlen(str2))
strcpy(str2,str);
}while(str1[i]!='\0');
}
main()
{
char str1[100],str2[100];
gets(str1);
lword(str1,str2);
puts(str2);
}
暂时不考虑多个空格的情况.运行前几次都是正确的,后边再运行的时候,居然输出结果还是上次运行的结果!

#include "stdafx.h"
#include <conio.h>
#include <string.h>
void lword(char str1[],char str2[])
{
int i=0,j=0,k=0;
char str[100];
while (str1[i]!='\0' && str1[i]!=' ')
{
str2[j++]=str1[i++];
}
str2[j]='\0'; i++; /*
这里出现问题了,当str[i]=='\0'时退出了这个循环,
但是i++,使得str[i]越过了字符串界,下面的问题就变得不可猜测了。
*/
do
{
j=0;
while(str1[i]!='\0' && str1[i]!=' ')
{
str[j]=str1[i];i++;j++;
}
str[j]='\0';i++;
if (strlen(str)>strlen(str2))
strcpy(str2,str);
}while(str1[i]!='\0');
}
/*我写了一个*/
void lword1(char *str1, char *str2)
{
char ch,*str;
int max,n;
max=0; n=0; /*max=最大单词长度,n=当前单词长度统计*/
str=str1; /*str=当前单词词头*/

while(ch=*str1++) {
if (ch!=' '&&ch!='\t') {n++; continue;}
if (max>=n) continue;
max=n; str=str1-n-1; n=0;
/*设置单词最大长度,词头,及开始新的单词长度统计*/
}
strncpy(str2,str,max); /*获得单词*/
str2[max]='\0'; /*在词后加结束符*/
}

void main()
{
char str1[100],str2[100];
gets(str1);
lword1(str1,str2);
puts(str2);
}

while(str1[i]!='\0' && str1[i]!=' ')
{
str[j]=str1[i];i++;j++;
}
str[j]='\0';i++;
改为
while(str1[i]!='\0' && str1[i]!=' ')
{
str[j]=str1[i];i++;j++;
}
str[j]='\0';
if(str1[i]==' ')i++;
也就是说你在进行i++时一定要保证目前的字符不是字符串的最后一个
保险一点的话,前面那个str2[j]='\0';后面那个也要改成if(str1[i]==' ')i++;

或是在main()里加个
memset(str1,0,sizeof(str1));(#include<mem.h>)
但是这样输入的字符总数不要超过98个

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

char* lword(char *str1)
{
unsigned int i;
int j=0,k=0,m;
static char str[100];
if(NULL==str1)return NULL;
for(i=0;i<=strlen(str1);i++)
{
j++;
if(' '==str1[i]||'\0'==str1[i])
{
if(k<j)
{
k=j;
for(m=0;m<k;m++)
str[m]=str1[i+m-j+1];
}
j=0;
}
}
return str;
}
void main()
{
char str1[100];
gets(str1);
char *str2=lword(str1);
cout<<str2;
cout<<endl;
}

这是用C++编的

细心点可以发现很多错误的.
while (str1[i]!='\0' && str1[i]!=' ')
{
str2[j++]=str1[i++];
}
str2[j]='\0'; i++;
如果有多个空格,那个i++后指向的还是个空格.
如果碰到字符串结束.此时str1[i]指向的是'\0'.但在下一句又有一个i++;这个时候str1[i]指向的是一个未知的值.怎么能顺利跳出那个do while 循环呢

dev-c++上没发现问题 测试10次以上

不过按你的程序单词之间最多只可以有1个空格

缓冲区太大了,没有必要设到100。
还有, i++ 调用太多次了,导致:i=1,3,5,7...而不是 1,2,3,4...