| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 861 人关注过本帖
标题:请教一个问题,为什么不能退出
只看楼主 加入收藏
黄昏の腕轮
Rank: 2
等 级:论坛游民
帖 子:64
专家分:12
注 册:2009-6-13
结帖率:100%
收藏
 问题点数:0 回复次数:10 
请教一个问题,为什么不能退出
程序如下:
#include "stdio.h"
#define MAX 1000
void copy(char t[],char s[]);
int getline(char s[],int max);
main()
{
    int len=0;
    int max=0;
    char s[MAX];
    char t[MAX];
   
    while((len=getline(s,MAX))>0)
           if(len>max){
                 max=len;
                 copy(t,s);
           }
    if(max>0)
       printf("%s",t);
    return 0;
   
}

int getline(char s[],int max)
{
    int c,i;
   
    for(i=0;i<MAX-1&&(c=getchar())!=EOF&&c!='\n';i++)
        s[i]=c;
        if(c=='\n'){
        s[i]=c;
        i++;}
        /*i++;*/
        s[i]='\0';
        return i;
}
void copy(char t[],char s[])
{
    int i=0;
    while((t[i]=s[i])!='\0')
    i++;
}
如果我把红色部分注释掉,蓝色的地方去掉注释,就不能退出程序了。。照理说,我输入完毕回车后,就接着执行下面的i++..等然后返回i。。但为什么注释掉“回车”那段之后,就不行了?for循环条件中有c!='\n'啊。
高手们请回答一下。。
唉,发现学C,怎么都入不了门一样。。。咋这么难呢。。。
搜索更多相关主题的帖子: color 
2009-10-01 15:30
沈默
Rank: 1
等 级:新手上路
帖 子:11
专家分:9
注 册:2009-9-29
收藏
得分:0 
#include "stdio.h"
#define MAX 1000
void copy(char t[],char s[]);
int getline(char s[],int max);
main()
{
    int len=0;
    int max=0;
    char s[MAX];
    char t[MAX];
     
    while((len=getline(s,MAX))>0)
           if(len>max){
                 max=len;
                 copy(t,s);
                 break;//必须有break,用来跳出循环
           }
    if(max>0)
       printf("%s",t);
    return 0;
     
}
 
int getline(char s[],int max)
{
    int c,i;
     
    for(i=0;i<MAX-1&&(c=getchar())!=EOF&&c!='\n';i++)
        s[i]=c;                //把所有的输入串付给s[i],但最后一个串结束符没有被复制到s[i]中去
        /*if(c=='\n'){
        s[i]=c;               //若加进i++,就会比原来多一字符
        i++;}
        i++;*/
        s[i]='\0';           //必须有,加入最后一个字符
        return i;
}
void copy(char t[],char s[])
{
    int i=0;
    while((t[i]=s[i])!='\0')
    i++;
}
可以退出了,按你的方法,就会多一个字符!希望可以帮到你!
2009-10-01 17:13
黄昏の腕轮
Rank: 2
等 级:论坛游民
帖 子:64
专家分:12
注 册:2009-6-13
收藏
得分:0 
以下是引用沈默在2009-10-1 17:13:42的发言:

#include "stdio.h"
#define MAX 1000
void copy(char t[],char s[]);
int getline(char s[],int max);
main()
{
    int len=0;
    int max=0;
    char s[MAX];
    char t[MAX];
     
    while((len ...
不是很明白。。
正确程序是这样的:
int getline(char s[],int max)
{
    int c,i;
   
    for(i=0;i<MAX-1&&(c=getchar())!=EOF&&c!='\n';i++)
        s[i]=c;
        if(c=='\n'){
        s[i]=c;
        i++;}
        s[i]='\0';
        return i;
}
但我做的时候,没有红色部分,但i++还是有:
int getline(char s[],int max)
{
    int c,i;
   
    for(i=0;i<MAX-1&&(c=getchar())!=EOF&&c!='\n';i++)
        s[i]=c;
        i++;
        s[i]='\0';
        return i;
}
但这个时候循环好像就不能结束了。。
不知道为什么必须要有红色部分。。
2009-10-01 17:42
黄昏の腕轮
Rank: 2
等 级:论坛游民
帖 子:64
专家分:12
注 册:2009-6-13
收藏
得分:0 
没人告诉我
2009-10-02 23:13
放弃那个阿姨
Rank: 2
等 级:论坛游民
帖 子:41
专家分:75
注 册:2009-9-29
收藏
得分:0 
学c是这样的,
你能写出这样的程序很不错了,
只是细节没有做好,
下回细心点就行了。
加油~
2009-10-02 23:19
黄昏の腕轮
Rank: 2
等 级:论坛游民
帖 子:64
专家分:12
注 册:2009-6-13
收藏
得分:0 
以下是引用放弃那个阿姨在2009-10-2 23:19:40的发言:

学c是这样的,
你能写出这样的程序很不错了,
只是细节没有做好,
下回细心点就行了。
加油~
谢谢你的鼓励。。
不过我是想问。。我为什么错了。。。=。 =
2009-10-03 12:31
UserYuH
Rank: 12Rank: 12Rank: 12
来 自:毅华
等 级:火箭侠
威 望:8
帖 子:720
专家分:3300
注 册:2009-8-10
收藏
得分:0 
按Ctrl+Z才能结束循环。
·
if(c=='\n')
{
  s[i]=c;
  i++;
}

红色这段只是保留换行符(不想保留也可以去掉)。
如什么字符都不输入,只按回车,getline函数还是会反回1的长度,s数组只存'\n'和'\0'两个值。
while((len=getline(s,MAX))>0);对这while里的判断,需要按Ctrl+Z才能结束循环。
·
你如去掉红色段后,你多加的 i++ 就没必要再加上去,for循环完i已是多加了1了。

努力—前进—变老—退休—入土
2009-10-03 13:43
黄昏の腕轮
Rank: 2
等 级:论坛游民
帖 子:64
专家分:12
注 册:2009-6-13
收藏
得分:0 
以下是引用UserYuH在2009-10-3 13:43:46的发言:

按Ctrl+Z才能结束循环。
·
if(c=='\n')
{
  s=c;
  i++;
}
红色这段只是保留换行符(不想保留也可以去掉)。
如什么字符都不输入,只按回车,getline函数还是会反回1的长度,s数组只存'\n'和'\0'两个值。
while( ...
关键就是按了Ctrl+Z也不能结束循环。。。
必须加上这么一句,按Ctrl+Z才能结束。。我就是没搞懂这儿。。还是说我的编译器有问题。。只有我这样?
if(c=='\n')
{
  s[i]=c;
  i++;
}

另外,如果我去掉红色部分,不加i++这句。我回车的时候,回车不满足for循环条件了,会跳出循环吧,i并没有+1,这时候下面:s[i]='\0';这句不是会把会车前的字符替换成'\0'吗?


[ 本帖最后由 黄昏の腕轮 于 2009-10-3 16:09 编辑 ]
2009-10-03 16:03
UserYuH
Rank: 12Rank: 12Rank: 12
来 自:毅华
等 级:火箭侠
威 望:8
帖 子:720
专家分:3300
注 册:2009-8-10
收藏
得分:0 
int getline(char s[],int max)
{
    int c,i;
     
    for(i=0;i<MAX-1&&(c=getchar())!=EOF&&c!='\n';i++)
        s[i]=c;
        i++; /* 只按一回车时或Ctrl+Z时,for没执行到,数组长度为0,但这却加1,反回都是大于0的数,肯定退不出,所以i++;这句要去掉。 */
        s[i]='\0'; /* 只按一回车时,s[0]='\0',你已去掉保存换行符了的代码,就没有替换之说 */
        return i;
}

努力—前进—变老—退休—入土
2009-10-03 16:37
hdm168
Rank: 1
等 级:新手上路
帖 子:9
专家分:1
注 册:2009-9-29
收藏
得分:0 
学习
2009-10-03 16:43
快速回复:请教一个问题,为什么不能退出
数据加载中...
 
   



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

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