EE_DSnP 板


LINE

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)







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Tech_Job站内搜寻

TOP