作者reefuj (重要的是心 心阿)
看板EE_DSnP
标题Re: [问题] 一个小问题...
时间Sun Nov 11 05:01:04 2007
在
http://topic.csdn.net/t/20050217/13/3787397.html
对我来说 里面的程式比这个例子容易了解cin.get()和cin.getline()的差别
其实在没有特别设定额外的delim状况下
cin 接受的 delim 是 换行字元 和 空白字元
cin.get() 接受的 delim 只有换行字元
cin.getline() 接受的 delim 只有换行字元
cin.get(char* s, streamsize n, char delim )是一个一个读入每个字元, 并
且把处理字元的pointer留在现在的delim上面
cin.getline(char* s, streamsize n, char delim )是一次读入一串字元阵列,
从s处切到delim出现前一个, 并且把处理字元的pointer切到第一个
delim之後的第一个字元(这样就做到直接忽略delim的效果)
1 #include <iostream>
2 using namespace std;
3 int main()
4 {
5 char myarray1[30];
6 cout<<"put your string 1:"<<"\n";
7 cin.getline(myarray1,30,'*'); <--输入 1111*2222换行
8 cout<<myarray1<<"\n"; <--输出 1111换行 (pointer在哪?)
9 char ch1;
10 cin.get(ch1);
11 cout<<ch1<<"\n"; <--输出 2换行 (pointer在哪?)
12
13 char myarray2[30];
14 cout<<"put your string 2:"<<"\n";
15 cin.get(myarray2,30,'*'); <--继续输入1111*2222换行
16 cout<<myarray2<<"\n"; <--输出 222换行1111换行 (why?)
17 char ch2;
18 cin.get(ch2);
19 cout<<ch2<<"\n"; <--输出*
20 return 0;
21 }
萤幕看到的结果最後的输出是
put your string 1:
1111*2222 <--line 7
1111 <--line 8
2 <--line 11
put your string 2:
1111*2222 <--line 15
222 <--line 16
1111 <--line 16
* <--line 19
大家可以比对看看前面的程式部份
我想前面两个输出大家都容易接受
後面两个只要想清楚你灌进去的cin只有一个就能够明白
其实你的输入就是
1111*2222(换行)1111*2222
而这只程式特别定义delim是 '*' 所以(换行)不是delim了 只是一个ASCII代码
-------上面是教学-------我是分隔线我是分隔线-------下面是回答问题--------
以下是针对fig05_11.cpp讨论
我的解释是 你的^z呢 其实你把它的功能当作要cin.get()去处理目前手上有
的字元时就说的通了 (有点类似换行, 但是他是一个没有ASCII码的按键组合, 换行有)
状况一
输入 "a (换行) ^z" 会得到A:1
解释: 因为(换行)按下去的时候, cin.get()会开始处理现在的字元串流,
所以A:0 -> A:1
此时pointer停在
(换行) <--(之前打成a....sorry)
但是这时候又遇到^z, 他要cin.get()处理在现在的字元串流
(想移动pointer到下一个位置, 可是已经在串流结尾, 回传EOF)
这就是停下来的原因
状况二
输入 "a ^z" 不会停
解释: 因为这一个^z会要cin.get处理a,
下一个^z停下来的原因同状况一的停止原因
所以结论是....其实这个程式设计的停止条件只有一个
就是那个字元串流空掉了 就该休息了....
而不是要你们打出EOF这个ASCII码就会停掉....
我不太确定EOF用按键打不打的出来...
※ 引述《jimjjj ((鲶川彦)~飞呀)》之铭言:
: ※ 引述《oker (oker)》之铭言:
: fig05_11.cpp的程式
: 当我输入a 再输入^z会得到A:1
: 当我输入abc 也会得到A:1 B:1 C:1
: 可是当我输入a^z 却甚麽也不会得到(当然 我再输入^z会得到A:1)
: cin.get()一次能接收一个字元..在这个.cpp中用while去跑
: 为什麽输入a^z不会得到A:1????
: ~~~~~~~~~~~~~~~~~
: 因为是cin.get()的特性吧~在这里是一次接收一个至char,所以当读入
: a^z後~先将a存入~而^z就留在输入伫列中~
: 所以再一次的cin.get()接收^z会显示default讯息
: 而或许也正是因为^z只是模拟所谓的档案结尾~
: 所以有些编译程式本来就只有必须在第一个字就^z然後紧接按enter才有用
: 也大概就是^z在下一次当做一种符号的原因吧~
: 此int 值是26~ // 是ascII码的值吧?
: 一个小程式可以验证cin.get()的特性
: int main (){
: char k;
: k=cin.get(); // 执行时一口气输入abc三个字
: cout<<k<<endl; //紧接着显示a
: k=cin.get();
: cout<<k<<endl; //下一行显示b
: k=cin.get();
: cout<<k<<endl; //下下一行显示c
: system("pause");
: }
: ~~~~~~~~~~~~~~~~~
: 推 ric2k1:助教, 请帮忙回答, 我手边没有课本. 11/09 17:17
: 推 nicksxz:根据我实验的结果 如果^z不是放一行的第一个位置的话 11/09 18:43
: → nicksxz:cin.get()会把它当成data 所以回圈还没结束 照理说应该 11/09 18:45
: → nicksxz:可以看到default的错误讯息 把grade印出来会看到4或26 11/09 18:46
: → nicksxz:真是有趣的发现! 11/09 18:51
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.42.185
1F:→ reefuj: ◆ 这一篇文章值 278 银 11/11 05:01
2F:推 timrau:EOF在Windows是Ctrl-Z 在Linux是Ctrl-D 11/11 10:45
※ 编辑: reefuj 来自: 140.112.231.25 (11/11 15:37)