标题:寻找一个字符串中最长的单词并输出
只看楼主
邹特强
Rank: 2
等 级:论坛游民
帖 子:123
专家分:85
注 册:2016-9-21
结帖率:85.71%
已结贴  问题点数:20 回复次数:14 
寻找一个字符串中最长的单词并输出
#include <stdio.h>
#include <string.h>
static void prin_max(char str1[],char str2[]);
int main()
{
    char flag='1';
    char str1[100],str2[100];
    while(flag=='1')
    {
      gets(str1);//一次输入一个单词
      prin_max(str1,str2);
      printf("\nDo you want to continue?Yes,print 1,No,print 0:");
      flag=getchar();//通过询问是否要继续输入,决定输入的单词数量
      printf("\n");
    }
    printf("%s",str2);
    return 0;
}
static void prin_max(char str1[],char str2[])//将长度更长的单词放入str2中,并存储更长的单词的长度
{
    int maxlen=0;
    if(strlen(str1)>maxlen)
    {
      strcpy(str2,str1);
      maxlen=strlen(str1);
    }
}
编译没问题,但运行时有两个问题
1,我每次输入一个单词后,电脑询问Do you want to continue?Yes,print 1,No,print 0:,我按1,然后enter,电脑就直接接着询问Do you want to continue?Yes,print 1,No,print 0:,而没有让我输入str1的值,为什么会这样
2,然后我改变输入方法,电脑询问Do you want to continue?Yes,print 1,No,print 0:时,我按1再输入下一个单词,再按enter,结果输入正常。但系统总的运行结果并未输出最长单词,而是输出我最后输入的单词,我哪里错了吗
搜索更多相关主题的帖子: 字符串 return include continue 单词 
2017-02-03 15:52
ICU
Rank: 4
等 级:业余侠客
威 望:2
帖 子:92
专家分:268
注 册:2017-1-14
得分:4 
getchar()函数只接收从键盘输入的一个字母,比如你按下的“1”
随后按下的回车被当成某个字符串的结束符被gets()接收。
所以如果不改变程序,可以在按下1后,直接输入字符串再回车。
当然要使界面更符合输入习惯,可以将pintf打印回车符变成一句输入提示语
2017-02-03 16:03
邹特强
Rank: 2
等 级:论坛游民
帖 子:123
专家分:85
注 册:2016-9-21
得分:0 
回复 2楼 ICU
谢谢你的热心回复,你说的这个我其实想到了,但我按我的想法去调试了程序,程序如下,添加了表情位置的代码,但并没有打出:you are right,为什么,我很困惑???
#include <stdio.h>
#include <string.h>
static void prin_max(char str1[],char str2[]);
int main()
{
    char flag='1';
    char str1[100],str2[100];
    while(flag=='1')
    {
      gets(str1);//一次输入一个单词
      prin_max(str1,str2);
      printf("\nDo you want to continue?Yes,print 1,No,print 0:");
      flag=getchar();//通过询问是否要继续输入,决定输入的单词数量
      printf("\n");
    }
    if(str1[0]=='\n')
    printf("you are right");
    printf("%s",str2);
    return 0;
}
static void prin_max(char str1[],char str2[])//将长度更长的单词放入str2中,并存储更长的单词的长度
{
    int maxlen=0;
    if(strlen(str1)>maxlen)
    {
      strcpy(str2,str1);
      maxlen=strlen(str1);
    }
}

............
2017-02-03 18:39
wei_guang
Rank: 1
等 级:新手上路
帖 子:9
专家分:5
注 册:2017-1-15
得分:3 
//寻找一个字符串中最长的单词并输出
 #include <stdio.h>
 #include <string.h>
 /*static*/ void prin_max(char str1[]/*,char str2[]*/);
 char str2[200];        // 把str2定义为全局变量,它的值一直保存
 int main()
 {
     char flag='1';
     char str1[100]/*,str2[100]*/;
     while(flag=='1')
     {
       printf("请输入一个单词\n");
       gets(str1);//一次输入一个单词
       prin_max(str1/*,str2*/);
       printf("\nDo you want to continue?Yes,print 1,No,print 0:");
       flag=getchar();//通过询问是否要继续输入,决定输入的单词数量
       getchar();        //加一个getchar接收1后面的enter,不然的话enter会被gets接收,导致你说的第一种情况
      printf("\n");
     }
     printf("%s",str2);
     return 0;
 }
 /*static*/ void prin_max(char str1[]/*,char str2[]*/)//将长度更长的单词放入str2中,并存储更长的单词的长度
{
     static int maxlen=0;
     if(strlen(str1)>maxlen)
     {
       strcpy(str2,str1);
       maxlen=strlen(str1);
     }
 }
/*编译没问题,但运行时有两个问题
1,我每次输入一个单词后,电脑询问Do you want to continue?Yes,print 1,No,print 0:,我按1,然后enter,电脑就直接接着询问Do you want to continue?Yes,print 1,No,print 0:,而没有让我输入str1的值,为什么会这样
2,然后我改变输入方法,电脑询问Do you want to continue?Yes,print 1,No,print 0:时,我按1再输入下一个单词,再按enter,结果输入正常。但系统总的运行结果并未输出最长单词,而是输出我最后输入的单词,我哪里错了吗 */
2017-02-03 20:11
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
得分:0 
回复 4楼 wei_guang
我试了下,可以正常运行哦。


[此贴子已经被作者于2017-2-3 21:16编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-02-03 21:12
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
得分:13 
但是这程序并不能判断单词,因为单词中并不会包含空白字符,但是用gets()会录入除回车之外的所有字符。

所以录入单词的话,最好用scanf(),这样就不会录入到空白字符了。

程序代码:
#include <stdio.h>

 #include <string.h>
void prin_max(char str1[]/*,char str2[]*/);

 char str2[200];        // 把str2定义为全局变量,它的值一直保存
                        // 200个字符的单词,这单词真够长的。
 int main()

 {
     char flag='1';
     char str1[200]/*,str2[100]*/;
     while(flag=='1')
     {
       printf("请输入一个单词\n");
       scanf("%s",str1);//一次输入一个单词 
       prin_max(str1);
       while(getchar() != '\n');
       printf("\nDo you want to continue?Yes,print 1,No,print 0:");
       flag=getchar();//通过询问是否要继续输入,决定输入的单词数量
       getchar();        //加一个getchar接收1后面的enter,不然的话enter会被gets接收,导致你说的第一种情况
      printf("\n");
     }
     printf("%s",str2);
     return 0;

 }
void prin_max(char str1[]/*,char str2[]*/)//将长度更长的单词放入str2中,并存储更长的单词的长度 
{
     static int maxlen=0;
     if(strlen(str1)>maxlen)
     {
       strcpy(str2,str1);
       maxlen=strlen(str1);
     }

 }


[此贴子已经被作者于2017-2-3 21:28编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-02-03 21:20
邹特强
Rank: 2
等 级:论坛游民
帖 子:123
专家分:85
注 册:2016-9-21
得分:0 
回复 4楼 wei_guang
谢谢您的回复,您用getchar()吸收enter个人觉得真的是神来之笔,有创意

............
2017-02-06 15:30
邹特强
Rank: 2
等 级:论坛游民
帖 子:123
专家分:85
注 册:2016-9-21
得分:0 
回复 6楼 renkejun1942
谢谢您的回复,你指出了我程序问题的关键,就是str2和maxlen被我弄成auto变量,导致函数每次调用结束就初始化。但我还有最后一点不清楚,就是按我回复二楼改编的那个调试程序,既然你说gets会吸收除了enter外的任何字符,按你的逻辑,gets(str1)那步应该没有接收任何字符,那我回复二贴中的第一个问题怎么来的??或者gets能接受enter,那为什么运行时没有打出“you are right"??请指教

............
2017-02-06 15:37
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
得分:0 
回复 8楼 邹特强
在函数中的变量默认为代码块作用域、空连接、自动存储,一旦函数运行完,该变量就从内存中消失了,当再次调用该函数的时候,该变量被再次创建,然后被初始化为0.也就是说,你的函数一直在和0比较,对比的结果当然是每一次都为真,然后将值赋以maxlen,然后函数结束,该值消失。

你想要函数中的变量保存值,你需要将它声明为静态变量,或者声明为全局变量,又或者让函数将值返回,另外还可以用指针。

static int maxlen = 0;

4楼的代码已经帮你修正了这个问题,我发在6楼的代码是基于他的代码而来,我只是稍微修改了一下,将gets() 改成了scanf()。

[此贴子已经被作者于2017-2-6 17:50编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-02-06 17:41
邹特强
Rank: 2
等 级:论坛游民
帖 子:123
专家分:85
注 册:2016-9-21
得分:0 
回复 9楼 renkejun1942
谢谢你的热心回复,你说的这个我其实想到了,但我按我的想法去调试了程序,程序如下,添加了表情位置的代码,但并没有打出:you are right,为什么,我很困惑???
#include <stdio.h>
#include <string.h>
static void prin_max(char str1[],char str2[]);
int main()
{
    char flag='1';
    char str1[100],str2[100];
    while(flag=='1')
    {
      gets(str1);//一次输入一个单词
      prin_max(str1,str2);
      printf("\nDo you want to continue?Yes,print 1,No,print 0:");
      flag=getchar();//通过询问是否要继续输入,决定输入的单词数量
      printf("\n");
    }
    if(str1[0]=='\n')
    printf("you are right");
    printf("%s",str2);
    return 0;
}
static void prin_max(char str1[],char str2[])//将长度更长的单词放入str2中,并存储更长的单词的长度
{
    int maxlen=0;
    if(strlen(str1)>maxlen)
    {
      strcpy(str2,str1);
      maxlen=strlen(str1);
    }
}


我想问的是这个,就是如果我的enter被gets吸收了,那为什么没有打出you are right?(我在我原来的代码里添加了一个if语句,就是两个表情夹着的那句)

............
2017-02-06 18:44



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-473952-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.450857 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved