请帮我解释一下这个函数(C语言)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请帮我解释一下这个函数(C语言)相关的知识,希望对你有一定的参考价值。

题目:编写一个函数,输入一行字符,将此字符串中最长的单词输出。
#include <stdio.h>
#include<string.h>
void main()
int alphabetic(char);
int longest(char[]);
int i;
char line[100];
printf("input one line:\n");
gets(line);
printf("The longest word is:");
for(i=longest(line);alphabetic(line[i]);i++)
printf("%c",line[i]);
printf("\n");


int alphabetic(char c)
if((c>='a'&&c<='z')||(c>='A'&&c<='Z'))
return(1);
else
return(0);


int longest(char str[])
int i,len=0,length=0,flag=1,place=0,point;
for(i=0;i<strlen(str);i++)
if(alphabetic(string[i]))
if(flag)
point=i;
flag=0;

else len++;
else
flag=1;
if(len>=length)
length=len;
place=point;
len=0;



return(place);


因为我是初学者,有点不懂这个程序,可以帮我详细解释一下吗?谢谢。
(1)最不懂int longest(char str[]) 一下的部分
(2)这句看不懂:for(i=longest(line);alphabetic(line[i]);i++)
(3)整个程序是如何运行的呢?


#include <stdio.h>
#include<string.h>
void main()

int alphabetic(char);
int longest(char[]);
int i;
char line[100];
printf("input one line:\\n");
gets(line);
printf("The longest word is:");
for(i=longest(line);alphabetic(line[i]);i++)
 printf("%c",line[i]);

printf("\\n");

//这是一个判断字符是否是英文字母的函数
//是则返回1,不是则返回0
 int alphabetic(char c)
 
if((c>='a'&&c<='z')||(c>='A'&&c<='Z'))
return(1); 

else
return(0);

  
 //这个函数是来统计哪一个连续字母子字符串最长
 //并返回那个子字符串在str中的起始位置
int longest(char str[]) 

int i,len=0,length=0,flag=1,place=0,point; 
for(i=0;i<strlen(str);i++) //循环str中所有的字符
//判断是否是字母,如果是(返回1)则进入,
//否则(返回0)进入else语句
if(alphabetic(str[i])) //根据代码来看不是string[i],更改之
if(flag)//flag标志应该是指是否是连续出现字母 

point=i;//记录当前全是字母的子字符串的起始位置
flag=0;//更改标记,下一次如还是字母就不能再进这个if判断了,而应该是进入else,把长度+1
 
else 
len++; 
else
flag=1;//如果出现了非字母,那么将标记置为1,以便下次出现字母时,进入判断的if中,而不是else中 
if(len>=length) //如果之前有出现连续字母的情况或者新的子字符串大于上一个的长度,则进入

length=len; //记录新的长度
place=point; //记录新的起始位置
len=0; //将这个变量置为0,以便下一次的记录
 
 

return(place); //返回最长字母字符串的起始位置

追问

你好,我运行一下这个程序,输出的不是最长的那个单词,是哪里出现问题了吗?

追答

哦,试了半天发现才发现你说的情况。
当时没注意看代码,是这个样子滴(输入下图中的字符)

这样子的话,在判断了最后一个字母h的时候,会进入那个 len++的语句,然后不执行记录位置的那个语句了,最后一次的for循环就直接结束了,进入最后一句代码。

这样的原因是,原代码中记录下最长字母的语句是和if(alphabetic(str[i])) 是同一级别的,只有在if(alphabetic(str[i]))判断不是字母的时候才会执行。


所以最简单的改法就是,在那个

longest(char str[]) 的for循环语句的最后加上

if (i == strLength -1)//如果是最后一次则再判断一次

if(len>length) 

length=len;
place=point;
len=0;



///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



另外发现另外一个问题,在

if(flag)//flag标志应该是指是否是连续出现字母 

point=i;//记录当前全是字母的子字符串的起始位置
flag=0;//更改标记,下一次如还是字母就不能再进这个if判断了,而应该是进入else,把长度+1
 
这段语句中也应该写上 len++ 哦....

参考技术A 这个程序有问题吧。编译肯定不过哎
(1)把第三个函数快中的string改成str就对了 ;这是求最长单词从何处开始的
(2)初值:最长单词的开始初;条件:下一个字符是字母;
(3)输入一个字符串,求出最长单词的头字母所在位置,输出最长的单词追问

str那里是我不小心打错了

追答

改了之后就ok了啊

参考技术B 此程序存在严重错误,不能运行。追问

请问哪里有错误?

追答

C参照2楼回答,我就不看了,

一个c语言表示的数据结构的问题,请帮我看一下

#include "stdio.h"
#include "stdlib.h"
typedef struct stu
int data[1000];
int length;
sqlist;
void sqlist_input(sqlist *L,int number)

int i;
L->length=number;
if(number==0)

printf("无数据!");
exit(1);

i=0;
while(i<number)

scanf("%d",&L->data[i]);
i++;


void sqlist_sort(sqlist *L1,sqlist *L2,sqlist *L3)

int i,j,k,h,n,m,l;
n=L1->length;
m=L2->length;
l=L3->length=0;
for(i=0,j=0;i<n,j<m;)

if(L1->data[i]<=L2->data[j]) //L1的当前位置小于或等于L2的当前位置时执行

if(l==0) //L3中没有元素时

L3->data[l]=L1->data[i];
++l;
i++;

else //L3有元素时按从小到大插入
for(k=0;k<l;k++)

if(L1->data[i]<=L3->data[k])

for(h=l-1;h<=k;h--)
L3->data[h+1]=L3->data[h];
L3->data[k]=L1->data[i];
++l;
i++;
break;


if(k==l) //若要插入的数大于表中最大的数,则插到最后位置

L3->data[l]=L1->data[i];
++l;
i++;



else //若L2中当前位置小于等于L1中的位置时,将L2中的当前数插入L3中
if(l==0)//若空表的话,插入第一个位置

L3->data[l]=L2->data[j];
++l;
j++;

else //L3不为空表时

for(k=0;k<l;k++) //从下到大排序然后插入

if(L2->data[j]<=L3->data[k])

for(h=l-1;h<=k;h--)
L3->data[h+1]=L3->data[h];
L3->data[k]=L2->data[j];
l++;
j++;
break;



if(k==l)//若该数比L3中的最大数大的话,则插到表尾

L3->data[l]=L2->data[j];
++l;
j++;




L3->length=l;

void sqlist_output(sqlist *L)

int i,n;
n=L->length;
i=0;
while(i<n)

printf("%d ",L->data[i]);
i++;


int main(void)

sqlist La,Lb,Lc;
int n,m;
printf("请输入La中的元素个数:\n");
scanf("%d",&n);
printf("请输入La中所有的元素:\n");
sqlist_input(&La,n);
printf("请输入Lb中的元素个数:\n");
scanf("%d",&m);
printf("请输入Lb中所有的元素:\n");
sqlist_input(&Lb,m);
sqlist_sort(&La,&Lb,&Lc);
printf("排序后为!\n");
sqlist_output(&Lc);
return 0;

当输入完所有数的时候就出现了这个图片,请大家帮我分析一下,这是为什么啊

#include "stdio.h"
#include "stdlib.h"
typedef struct stu
int data[1000];
int length;
sqlist;
void sqlist_input(sqlist *L,int number)

int i;
L->length=number;
if(number==0)

printf("无数据!");
exit(1);

i=0;
while(i<number)

scanf("%d",&L->data[i]);
i++;


void sqlist_sort(sqlist *L1,sqlist *L2,sqlist *L3)

int i,j,k,h,n,m,l;
n=L1->length;
m=L2->length;
l=L3->length=0;
for(i=0,j=0;i<n||j<m;)

if(j>=m || i<n && L1->data[i]<=L2->data[j]) //L1的当前位置小于或等于L2的当前位置时执行

if(l==0) //L3中没有元素时

L3->data[l]=L1->data[i];
++l;
i++;

else //L3有元素时按从小到大插入
for(k=0;k<l;k++)

if(L1->data[i]<=L3->data[k])

for(h=l-1;h>=k;h--)
L3->data[h+1]=L3->data[h];
L3->data[k]=L1->data[i];
++l;
i++;
break;


if(k==l) //若要插入的数大于表中最大的数,则插到最后位置

L3->data[l]=L1->data[i];
++l;
i++;



else //若L2中当前位置小于等于L1中的位置时,将L2中的当前数插入L3中
if(l==0)//若空表的话,插入第一个位置

L3->data[l]=L2->data[j];
++l;
j++;

else //L3不为空表时

for(k=0;k<l;k++) //从下到大排序然后插入

if(L2->data[j]<=L3->data[k])

for(h=l-1;h>=k;h--)
L3->data[h+1]=L3->data[h];
L3->data[k]=L2->data[j];
l++;
j++;
break;



if(k==l)//若该数比L3中的最大数大的话,则插到表尾

L3->data[l]=L2->data[j];
++l;
j++;




L3->length=l;

void sqlist_output(sqlist *L)

int i,n;
n=L->length;
i=0;
while(i<n)

printf("%d ",L->data[i]);
i++;


int main(void)

sqlist La,Lb,Lc;
int n,m;
printf("请输入La中的元素个数:\n");
scanf("%d",&n);
printf("请输入La中所有的元素:\n");
sqlist_input(&La,n);
printf("请输入Lb中的元素个数:\n");
scanf("%d",&m);
printf("请输入Lb中所有的元素:\n");
sqlist_input(&Lb,m);
sqlist_sort(&La,&Lb,&Lc);
printf("排序后为!\n");
sqlist_output(&Lc);
return 0;
追问

看着您的代码只给我改了这些for(i=0,j=0;i=m || idata[i]data[j]) //L1的当前位置小于或等于L2的当前位置时执行
我的到底错在哪了呢?我怎么看不出来呢?请多多指教,详细解答解答吧

追答

还有这个,h>=k

for(h=l-1;h>=k;h--)
L3->data[h+1]=L3->data[h];

你的问题在于逻辑不太清晰,比如idata[i]data[j]) 的越界问题

参考技术A 你是MM么?代码写得这么烂。
La和Lb都是无序列表,你选处理好La,然后同样的逻辑再出来Lb,结果不是一样的么?
La和Lb一起循环,除了增加程序出错的可能性外,没有任何意义啊!追问

我是根据别的例子延伸到的这个,举一反三吗不是

追答

我的意思是说,如果你看不出来哪里出错了,就把处理改简单,然后很容易就能看出问题出在哪里。这样的话,即不需要问别人,也会有很大的进步。
根据我的经验,代码重构比在烂代码里找错有意义得多。

追问

受教了,虽然已经选了,但还是很感谢您

参考技术B 排序算法写错了,导致Lc的data数组越界!自己改改那个排序吧。

以上是关于请帮我解释一下这个函数(C语言)的主要内容,如果未能解决你的问题,请参考以下文章

一个c语言表示的数据结构的问题,请帮我看一下

C语言计算器

c语言malloc函数

帮介绍一下C语言里的varargs。

C语言指针初学者 请帮我看看下面的提 为啥调用函数返回值是char型的 这样不就只能返回一个字符了吗

请帮我解释一下下列计算机名词,好吗?谢谢!