标题:简单的字符排序程序,不知到怎样让它结束输入
只看楼主
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
得分:0 
能问问楼主的行号是怎么加进去的吗?28 29 之间为什么看上去还有一个空行?
2012-07-27 13:45
LShang
Rank: 4
来 自:China
等 级:业余侠客
威 望:3
帖 子:183
专家分:258
注 册:2010-12-24
得分:0 
以下是引用TonyDeng在2012-7-27 13:43:38的发言:

char *linePtr[NLINES_MAX];   这是什么?
char* getline(void);         这种函数原型,它怎么把“一行文本”返回给调用者?

以为在函数内部返回一个字符串指针就能把整个字符串送出去?就算不知道自己该怎么写getline(),起码也参考一下标准库函数gets()的原型是怎样的。是的,C++的System::Console::ReadLine()可以直接返回一行文本,但那个实现不是他这样return的呢。


我想我真的是哪个概念发生问题了,刚才跟踪了下程序发现跟我想象的执行基本是一样的,但是除了申请的内存未释放还是没找到其他问题
T版可否详细的指导一下

学如逆水行舟,不进则退
士不可以不弘毅,任重而道远
2012-07-27 13:52
q215236213
Rank: 4
等 级:业余侠客
威 望:1
帖 子:148
专家分:276
注 册:2012-7-24
得分:0 
for( ; n<NLINES_MAX && (linePtr[n] = getline())!=NULL;++n);
for语句后面加了 分号,表示 for 循环后面执行的是一个空的语句
指针目前还不是很熟,但至少觉得这个语句写的有点问题!~
2012-07-27 13:54
LShang
Rank: 4
来 自:China
等 级:业余侠客
威 望:3
帖 子:183
专家分:258
注 册:2010-12-24
得分:0 
以下是引用q215236213在2012-7-27 13:54:21的发言:

for( ; n<NLINES_MAX && (linePtr[n] = getline())!=NULL;++n);
for语句后面加了 分号,表示 for 循环后面执行的是一个空的语句
指针目前还不是很熟,但至少觉得这个语句写的有点问题!~

这条语句应该是重复调getline获取输入,将每一行都解析成一个单独的字符串并从堆里申请空间复制到堆中,然后返回申请到的堆地址。
直到输入行数等于规定最大行数或者未再获取到输入为止。返回的每个地址都被赋值到了linePtr这个指针数组里。
始终没找到这句的问题在哪,倒是感觉函数体里边有点怪,对fgets不怎么熟悉,我去跟一下输入EOF之后函数是怎么执行的。

学如逆水行舟,不进则退
士不可以不弘毅,任重而道远
2012-07-27 14:02
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
在getline()函数中,他的linePtr是malloc()得到的,除非分配不成功,哪来的return NULL?

授人以渔,不授人以鱼。
2012-07-27 14:03
LShang
Rank: 4
来 自:China
等 级:业余侠客
威 望:3
帖 子:183
专家分:258
注 册:2010-12-24
得分:0 
回复 15楼 TonyDeng
函数开始的时候linePtr被初始化成了NULL啊
如果获取不成功的话,linePtr不被改变,返回的直接就是NULL啊。

学如逆水行舟,不进则退
士不可以不弘毅,任重而道远
2012-07-27 14:05
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
你见过这种分配有不成功的吗?

授人以渔,不授人以鱼。
2012-07-27 14:08
LShang
Rank: 4
来 自:China
等 级:业余侠客
威 望:3
帖 子:183
专家分:258
注 册:2010-12-24
得分:0 
以下是引用TonyDeng在2012-7-27 14:08:44的发言:

你见过这种分配有不成功的吗?

malloc是在fgets返回结果不为NULL的情况下才执行的啊
如果从输入流得到的是EOF那fgets返回NULL,函数直接返回,就不调用malloc了

学如逆水行舟,不进则退
士不可以不弘毅,任重而道远
2012-07-27 14:13
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
刚开始我确是没留意他后面有malloc(),只看到前面用了fgets(),就感觉是return buffer,才说性质跟前面那些相像,那是我说错了。有了malloc(),那是getline()没写好。fgets()没什么机会返回NULL,除非真的按下Ctrl+D,然而他并非用linePtr来接收fgets(),而是linePtr = malloc()。

授人以渔,不授人以鱼。
2012-07-27 14:16
LShang
Rank: 4
来 自:China
等 级:业余侠客
威 望:3
帖 子:183
专家分:258
注 册:2010-12-24
得分:0 
以下是引用TonyDeng在2012-7-27 14:16:01的发言:

刚开始我确是没留意他后面有malloc(),只看到前面用了fgets(),就感觉是return buffer,才说性质跟前面那些相像,那是我说错了。有了malloc(),那是getline()没写好。fgets()没什么机会返回NULL,除非真的按下Ctrl+D,然而他并非用linePtr来接收fgets(),而是linePtr = malloc()。

程序代码:
char *getline() 
{ 
    char buffer[LEN_MAX],*linePtr =NULL;
    if(fgets(buffer,LEN_MAX,stdin) != NULL) 
    { 
        size_t len = strlen (buffer); 
        if( buffer[len-1] == '\n') 
            buffer[len-1]= '\0'; 
        else 
            ++len; 
        if((linePtr =malloc(len))!=NULL) 
            strcpy(linePtr,buffer);
    } 
    return linePtr; 
} 

他的函数排版之后是这样的,只要得到了EOF,malloc是没机会执行的,所以还是可以返回NULL的

学如逆水行舟,不进则退
士不可以不弘毅,任重而道远
2012-07-27 14:18



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




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

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