| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 931 人关注过本帖
标题:《C语言入门经典》中的一个程序,请高手指点一下!
只看楼主 加入收藏
chrisgardner
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:73
专家分:114
注 册:2013-9-25
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:14 
《C语言入门经典》中的一个程序,请高手指点一下!
这个是 第七章-指针初探 7.13 的程序,作用是读取任意数量的字符串,直到指定的数量为止,并确保读入的字符串不超过所提供的空间。程序截图如下:
图片附件: 游客没有浏览图片的权限,请 登录注册

图片附件: 游客没有浏览图片的权限,请 登录注册

图片附件: 游客没有浏览图片的权限,请 登录注册

7.13.rar (992 Bytes)

照着书本敲入代码,除了修改了字符串长度,和指针个数外,其他没有变化,问题是:
1. 为什么字符串长度为 6 时,却只能输入 4 个字符?不是应该能输入 5 个字符吗?
2.第22行中 while 的循环判断条件,pbuffer - buffer < BUFFER_LEN - 1, 这里的pbuffer是递增后的还是没有递增的?
3.为啥第28行的if语句没有起到效果呢?
请高手指点一下,万分感谢
搜索更多相关主题的帖子: C语言 字符串 经典 空间 
2014-05-13 10:50
top398
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:2
帖 子:427
专家分:857
注 册:2014-5-2
收藏
得分:15 
        while ( ( pbuffer - buffer < BUFFER_LEN - 1 ) &&
                ( ( *pbuffer++ = getchar() ) != '\n' ) );
BUFFER_LEN - 1 == 4
读字符的条件之一是 pbuffer - buffer < 4。

读入1个字符时, pbuffer - buffer == 1
读入2个字符时, pbuffer - buffer == 2
读入3个字符时, pbuffer - buffer == 3
读入4个字符时, pbuffer - buffer == 4,已不满足条件,不会再读字符。
2014-05-13 14:41
chrisgardner
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:73
专家分:114
注 册:2013-9-25
收藏
得分:0 
回复 2 楼 top398
BUFFER_LEN 定义的是6,BUFFER_LEN - 1 为什么是 4?
2014-05-13 14:43
top398
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:2
帖 子:427
专家分:857
注 册:2014-5-2
收藏
得分:0 
一时粗心看错了,以为 BUFFER_LEN = 5。

但是你这程序是通不过编译的。
    char *ps[NUM_P] = { NULL };
不能初始化 VLA 数组。
2014-05-13 15:32
top398
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:2
帖 子:427
专家分:857
注 册:2014-5-2
收藏
得分:0 
经测试,可以保存5个字符。——错了,是将 BUFFER_LEN - 1 改成 BUFFER_LEN 后。有些事所以没有及时细看。


[ 本帖最后由 top398 于 2014-5-13 16:28 编辑 ]
2014-05-13 16:11
top398
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:2
帖 子:427
专家分:857
注 册:2014-5-2
收藏
得分:0 
修改楼主的代码如下:
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
const size_t BUFFER_LEN = 6;
const size_t NUM_P = 2;

int main( void )
{
    char buffer[BUFFER_LEN+1];
    char *ps[NUM_P];
    char *pbuffer = buffer;
    int i;
    for ( i = 0; i < NUM_P; i++ ) ps[i] = NULL;
    printf( "\nYou can enter up to %u messages each up to %u characters.",
            NUM_P, BUFFER_LEN - 1 );
    for ( i = 0; i < NUM_P; i++ ) {
        pbuffer = buffer;
        printf( "\nEnter %s message, or press Enter to end\n",
                i > 0 ? "another" : "a" );
        while ( ( pbuffer - buffer < BUFFER_LEN - 1 ) &&
                ( ( *pbuffer++ = getchar() ) != '\n' ) );
        if ( ( pbuffer - buffer ) < 2 )
            break;
        if ( ( pbuffer - buffer ) == BUFFER_LEN && *( pbuffer - 1 ) != '\n' ) {
            printf( "String too long - maximum %d characters allowed.",
                    BUFFER_LEN );
            i--;
            continue;
        }
        *( pbuffer - 1 ) = '\0';
        ps[i] = ( char * )malloc( pbuffer - buffer );
        if ( ps[i] == NULL ) {
            printf( "\nOut of memory - ending program." );
            return 1;
        }
        strcpy( ps[i], buffer );
    }
    printf( "\nIn reverse order, the strings you entered are:\n" );
    while ( --i >= 0 ) {
        printf( "\n%s", ps[i] );
        free( ps[i] );
        ps[i] = NULL;
    }
    printf( "\n\n" );
    return 0;
}


程序并不长,你应该直接放在贴子里,这样一目了然,不需要下载附件。

运行结果:
R:\>a

You can enter up to 2 messages each up to 5 characters.
Enter a message, or press Enter to end
abcdefghijk

Enter another message, or press Enter to end

In reverse order, the strings you entered are:

fghi
abcd



[ 本帖最后由 top398 于 2014-5-13 16:40 编辑 ]
2014-05-13 16:27
top398
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:2
帖 子:427
专家分:857
注 册:2014-5-2
收藏
得分:0 
好好想一下如此的原因。


[ 本帖最后由 top398 于 2014-5-13 16:33 编辑 ]
2014-05-13 16:30
top398
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:2
帖 子:427
专家分:857
注 册:2014-5-2
收藏
得分:0 
2.第22行中 while 的循环判断条件,pbuffer - buffer < BUFFER_LEN - 1, 这里的pbuffer是递增后的还是没有递增的?
===============
pbuffer 此时是原值,但当它不满足条件时,紧接着判断的条件中会执行 递增操作,因此下次判断时 pbuffer 已经递增了。

此段有误,应改为:
pbuffer 此时是原值,但当它满足条件时,紧接着判断的条件中会执行 递增操作,因此下次判断时 pbuffer 已经递增了。


[ 本帖最后由 top398 于 2014-5-13 21:21 编辑 ]
2014-05-13 16:32
top398
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:2
帖 子:427
专家分:857
注 册:2014-5-2
收藏
得分:0 
3.为啥第28行的if语句没有起到效果呢?

根据
        while ((pbuffer - buffer < BUFFER_LEN - 1) &&
                ((*pbuffer++ = getchar()) != '\n'));

pbuffer - buffer 最多会 == BUFFER_LEN -1

因此,
        if ((pbuffer - buffer) == BUFFER_LEN && *(pbuffer - 1) != '\n')
的第一个条件不可能为真。
2014-05-13 16:59
top398
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:2
帖 子:427
专家分:857
注 册:2014-5-2
收藏
得分:0 
1. 为什么字符串长度为 6 时,却只能输入 4 个字符?不是应该能输入 5 个字符吗?

确实是最多输入了 5 个字符。但是,
        *(pbuffer - 1) = '\0';
吃掉了一个字符。这里本应该判断一下,*(pbuffer - 1) 是否等于 '\n' ,即是否没有输入够5个字符就按回车了。
2014-05-13 17:05
快速回复:《C语言入门经典》中的一个程序,请高手指点一下!
数据加载中...
 
   



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

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