指针*pbuffer和getchar 读取字符串

本文介绍了C语言中如何使用指针处理字符串,特别是通过`char *pbuffer`和`getchar()`函数读取用户输入的字符串。在示例代码中,`while`循环利用`getchar()`逐字符读取输入,直到遇到换行符` `,并在结束后添加字符串结束标志``。此外,还讨论了指针作为数组存储字符串引用的可能性以及未初始化指针的风险。
摘要由CSDN通过智能技术生成

在C语言入门教材里看到这一段代码,没看懂是什么意思。
char buffer[10];
char *pbuffer = buffer;
while( (*pbuffer++ = getchar() )!= '\n');
*pbuffer = '\0';
尤其是第三段while( (*pbuffer++ = getchar() )!= '\n'); 这里的getchar取的是什么数据,是我输入的数据吗?*pbuffer是一个指针数组吗,是不是存了输入的所有信息?

 

*buffer不是指针数组,是一个字符型的指针,让指针pbuffer指向了数组buffer的首地址,那么*pbuffer就跟buffer[0]是等价的,而pbuffer++的意思就是让pbuffer指向当前所指的下一个单元。也就是说执行完pbuffer++以后,*pbuffer就和buffer[1]等价。

while( (*pbuffer++ = getchar() )!= '\n');的作用是读取输入的字符到buffer中,遇到换行符停止读取。
getchar的意思是读取一个字符变量并返回,

追问
那这段代码执行完之后,*pbuffer这个指针存的是什么内容?
 
追答
未知的。
执行完*pbuffer = getchar()后 pbuffer又自加了一次,此时pbuffer是指向的地址是'\n'的下一个元素的地址,而这个值你的代码里边并没有给出结果,所以是未知的。


 指针的学习(四)——指针处理字符串 

1、指针处理字符串

我们可以用char类型的数组变量存储字符串,也可以使用char类型的指针变量引用字符串。这个方法在处理字符串时非常灵活。如下所示:

char *pString = NULL;

注意,指针只是一个存储另一个内存位置的地址变量。前面只创建了指针,没有指定一个存储字符串的地方。要存储字符串,需要分配一些内存。可以声明一块内存,来存储字符串数据,然后使用指针追踪这块存储字符串的内存。

1、使用指针更多的控制字符串输入

在读取文本时,常需要比scanf()函数更多的控制。在<stdio.h>中声明的getchar()函数提供了非常基本的操作,一次只读取一个字符,但是它可控制何时停止读入字符。这样就可以确保不会超过存储输入而分配的内存。

getchar()函数从键盘读入一个字符,并以int类型返回。可以把一个结尾‘\n'的字符串读入所定义的数组中。如下

char buffer[100];

char *pbuffer = buffer;

while((*pbuffer++ = getchar() != '\n');

*pbuffer = '\0';

所有的输入都在while循环的条件中完成。getchar()函数读取一个字符,并它存储在pbuffer的当前地址中。然后,递增pbuffer中的地址,以指向下一个字符。在循环结束后,将'\0'字符添加到下一个可用的位置上。

2、使用指针数组

处理多个字符串时,可以在堆上使用指针数组存储对字符串的引用。下面用一个例子来说明

 

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#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;
   int i;
 
   printf ( "\\nEnter 3 messages that total less than %u characters." , BUFFER_LEN - 2);
 
   for (i = 0; i < 3; i++)
   {
     printf ( "\\nEnter %s message\\n" , i > 0 ? "another" : "a" );
     pS[i] = &buffer[index];
     for (; index < BUFFER_LEN; index++)
       if ((*(pbuffer + index) = getchar ()) == '\\n' )
       {
         *(pbuffer + index++) = '\\0' ;
         break ;
       }
       if ((index == BUFFER_LEN) && ((*(pbuffer + index - 1) != '\\0' ) || (i < 2)))
       {
         printf ( "\\nYou ran out of space in the buffer." );
         return 1;
       }
     }
   printf ( "\\nThe string you entered are:\\n\\n" );
   for (i = 0; i < 3; i++)
     printf ( "%s\\n" , pS[i]);
   printf ( "The buffer has %d characters unused.\\n" , BUFFER_LEN - index);
   return 0;
}
      结束输出如下:

 

 

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Enter 3 messages that total less than 510 characters.
Enter a message
Hello C
 
Enter another message
Today is a great day for learngin
 
Enter another message
so start len
 
The string you entered are:
 
Hello C
Today is a great day for learngin
so start len
The buffer has 457 characters unused.

 

代码说明:

首先定义全局变量BUFFER_LEN指定buffer数组的大小

const size_t BUFFER_LEN = 512;

这个变量必须声明为const,才能用来指定数组大小;数组的大小只能用常量式来指定。

接着就是主函数定义

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值