标题:初学指针,关于输出的问题
只看楼主
bxe
Rank: 1
等 级:新手上路
帖 子:57
专家分:7
注 册:2019-3-21
结帖率:72.22%
已结贴  问题点数:10 回复次数:3 
初学指针,关于输出的问题
程序代码:
//program 7.12 arrays of pointers to string
#include <stdio.h>
const size_t BUFFER_LEN = 512;

int main(void)
{
    char buffer[BUFFER_LEN];
    char *pS[3] = { NULL };
    char *pbuffer = buffer; /*起始位置指针*/
    size_t index = 0; /*存储字符计数*/

    printf("\nEnter 3 messages that total less than %u characters. ",BUFFER_LEN-2);
    printf("%d    %d", *pbuffer,pbuffer);

    for(int i=0; i<3; i++)
    {
        printf("\nEnter %s message\n", i>0? "another" : "a");
        pS[i] = &buffer[index];/* 指向每段语句的开头*/

        for(; index<BUFFER_LEN; index++) /*遍历512个字节*/
            if((*(pbuffer+index) = getchar()) == '\n')
        {
            *(pbuffer+index++) = '\0';
            break;
        }
        if((index == BUFFER_LEN) && ((*(pbuffer+index-1) != '\0') || (i<2)))/*i<2 是在防止什么情况?*/
        {
            printf("\nYou ran out of space in the buffer.");
            return 1;
        }
    }
    printf("\nThe strings you entered are:\n\n");
    for(int i=0; i<3; i++)
        printf("%s\n", pS[i]);/*为什么只是一个开头地址输出了这么多*/
    printf("The buffer has %d characters unsed.\n",BUFFER_LEN-index);
    return 0;

}
由于是看书自学,可能从原理认识上就有错误,求多多指点。
这是书中一个例子,指针数组。注释是根据自己理解写的。
有两个问题没有想通:
1,第二个if()中 ||i<2 是在防止什么情况发生?
2,pS[i] = &buffer[index]分别用三个元素存储了三个字符串的 开头 地址,但为什么之后使用printf()输出,不是只输出了地址存储的单个字符,而是输出了整个字符串(到\0)?  
预谢。
搜索更多相关主题的帖子: 指针 输出 buffer index printf 
2019-04-12 23:38
bxe
Rank: 1
等 级:新手上路
帖 子:57
专家分:7
注 册:2019-3-21
得分:0 
程序代码:
//
#include <stdio.h>

int main()
{


 char *pString ="To be or not to be";

 printf("1 >   %s   ,%c  \n" ,   pString, pString[3]);


 *(pString+3) = 'm';

 printf("2 >   %c    \n" ,   pString[3]);

    return 0;
}
这是用于测试的,但之前的还是没弄明白,这个不知道为什么,第二个printf()不显示
2019-04-13 00:51
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:5 
不能修改
试试:
#include <stdio.h>
int main()
{
    char pString[] ="To be or not to be\0";
    printf("1 >   %s   ,%c  \n" ,   pString, pString[3]);
    char *p = pString;
    *(p+3) = 'm';
    printf("2 >   %c    \n" ,   pString[3]);
    return 0;
}
2019-04-13 05:16
word123
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:13
帖 子:333
专家分:1622
注 册:2014-4-5
得分:5 
1,第二个if()中 ||i<2 是在防止什么情况发生?
//index == BUFFER_LEN表示buffer空间已经用完了。
//后面两个表达式只要一个为真,整个表达式就为真
//若前面为真,表示buffer空间的最后一个字符不是字符串结尾'\0',则表明当前字符串buffer空间不足
//若前面为假,表明buffer的最后一个字符是'\0',但i<2表示pS的三个指针没有用完buffer空间就已经不足了,也说明了buffer空间不足;若i==2则说明buffer刚好存储三个字符串,if()就不会执行了
if((index == BUFFER_LEN) && ((*(pbuffer+index-1) != '\0') || (i<2)))/*i<2 是在防止什么情况?*/
        {
            printf("\nYou ran out of space in the buffer.");
            return 1;
        }

2,pS[i] = &buffer[index]分别用三个元素存储了三个字符串的 开头 地址,但为什么之后使用printf()输出,不是只输出了地址存储的单个字符,而是输出了整个字符串(到\0)?
  可以自己去查一下printf怎么输出字符串的
2019-04-13 16:25



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




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

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