zoukankan      html  css  js  c++  java
  • C/C++中字符串的输入问题

      1 standard C I/O
      2 头文件:#include <stdio.h>
      3 
      4 1. getchar()
      5 
      6 原型:int getchar(void);
      7 功能:从标准输入获取并返回下一个字符,并释放该字符空间。
      8 返回值:读取的字符的ASCII,出错或到达文件结尾时返回EOF(-1)。
      9 
     10 键盘   缓冲区   getchar读取字符
     11 入水口 蓄水池   出水口
     12 
     13 a. 我们从键盘输入的字符串首先是放在缓冲区内的,再利用getchar()函数从缓冲区内读取字符。
     14 b. 当用户键入回车符之后,getchar()才开始从缓冲区中读取字符(一次调用读取一个字符)。
     15 c. 键入Enter建实际上产生了2个字符(回车符'
    '和换行符'
    ')。回车符'
    '使光标回到行首,换行符'
    '换行。
     16 
     17 
     18 // 读取含有space(空格),table(制表符)的字符串
     19 
     20 #include <stdio.h>
     21 
     22 int main()
     23 {
     24     int t;
     25     while ('
    ' != (c = getchar())) printf("%c", t);
     26     return 0;
     27 }
     28 
     29 /*
     30  * input: 123table456space789
     31  * output: 123        456 789
     32  */
     33 
     34 // 当使用scanf()和gets()连用时,要使用getchar()清除scanf()输入完成最后键入的Enter键
     35 
     36 #include <stdio.h>
     37 
     38 int main()
     39 {
     40     int nCase;
     41     scanf("%d", &nCase);
     42     getchar();        // 清空缓冲区
     43     while (nCase--)
     44     {
     45         char str[10];
     46         gets(str);
     47         printf("%s
    ", str);
     48     }
     49     return 0;
     50 }
     51 /*
     52  * input: 
     53  * 2
     54  * 123 456
     55  * abc def
     56  * output:
     57  * 123 456
     58  * abc def
     59  */
     60 
     61 
     62 2. gets()
     63 
     64 原型:char* gets(char* str);
     65 功能:从标准输入读取字符并把他们加载到str里,直到遇到换行或者到达EOF
     66 返回值:返回读入的字符串,发生错误时返回NULL
     67 
     68 gets()和scanf()都可以输入字符串,两者的异同:
     69 a. 不同点:
     70 scanf()不能接受空格、制表符、回车
     71 gets()可以接受空格、制表符,遇到回车结束输入
     72 b. 相同点:
     73 字符串接受结束后自动加''
     74 
     75 
     76 3. scanf()
     77 
     78 原型:int scanf(const char* format,...);
     79 功能:由format指定的格式从标准输入读取,并保存数据到其参数
     80 返回值:成功赋值的变量的个数,发生错误时返回EOF
     81 
     82 a. scanf()读取匹配format字符串,当读取到控制字符,它就把值放置到对应变量
     83 b. 空白会跳过,非空白字符和输入匹配,然后丢弃
     84 c. %符号和控制符间的数,控制指定数量的字符转换到变量中
     85 d. scanf()遇到一个字符集(用%[]表示的),那么在括号中的任意字符都会读取到变量中
     86 
     87 scanf("%d %d", &a, &b);
     88 如果a和b被成功读入,返回2
     89 如果只有a被成功读入,返回1
     90 如果a和b都未被成功读入,返回0
     91 如果遇到错误或遇到end of file,返回值EOF(-1)
     92 只有当第一个参数为NULL时,才可能返回EOF
     93 
     94 可以采用%[^
    ]格式控制来输入含有空格,制表符的字符串
     95 
     96 #include <stdio.h>
     97 
     98 int main()
     99 {
    100     char str[50];
    101     scanf("%[^
    ]", str);
    102     printf("%s
    ", str);
    103     return 0;
    104 }
    105 /*
    106  * input: 123 456
    107  * output: 123 456
    108  */
    109 
    110 
    111 C++输入含有空格制表符的字符串
    112 
    113 对于字符数组
    114 
    115 1. getline()
    116 
    117 有两种重载,只介绍一种
    118 原型:istream& getline(char* buffer, streamsize num);
    119 功能:读取字符到buffer中,直到发生以下情况:
    120       a. num - 1个字符已经读入
    121       b. 碰到换行符
    122       c. 碰到EOF
    123       d. 碰到字符delim(delim字符不会被放入buffer中)
    124 返回值:如果getline()没有读入字符,将返回false,可用于判断文件是否结束。
    125 
    126 调用方法:cin.getline(str, len);
    127 args1: 用来存储输入数据    args2: 要读取的字符数
    128 
    129 #include <iostream>
    130 using namespace std;
    131 
    132 int main()
    133 {
    134     char str[30];
    135     cin.getline(str, 30);
    136     cout << str << endl;
    137     return 0;
    138 }
    139 /*
    140  * input: 123 456
    141  * output: 123 456
    142  */
    143 
    144 
    145 2. get()
    146 
    147 有多种重载,只介绍一种
    148 原型:istream& get(char* buffer, streamsize num);
    149 功能:读取字符到buffer直到num - 1个字符被读入, 或者碰到EOF或换行标志
    150 返回值:发生错误时返回false,可用于判断是否正常输入
    151 
    152 调用方法:cin.get(str, len);
    153 
    154 #include <iostream>
    155 using namespace std;
    156 
    157 int main()
    158 {
    159     char str[30];
    160     cin.get(str, 30);
    161     cout << str << endl;
    162     return 0;
    163 }
    164 /*
    165  * input: abc def
    166  * output: abc def
    167  */
    168  
    169 getline()和get()的区别
    170 
    171 两者都读取一行输入,直至换行符。
    172 然后,getline将丢弃换行符,而get()将换行符保留在输入序列里。
    173 所以,再使用cin.get()输入多行数据时,中间可以使用get()消除换行符。
    174 
    175 #include <iostream>
    176 using namespace std;
    177  
    178 int main()
    179 {
    180     char str1[30], str2[30];
    181     cin.get(str1, 30);
    182     cin.get();
    183     cin.get(str2, 30);
    184     cout << "str1: " << str1 << endl;
    185     cout << "str2: " << str2 << endl;
    186     return 0;
    187 }
    188 /*
    189  * input: abc def
    190  *        123 456
    191  * output: str1: abc def
    192  *         str2: 123 456
    193  */
    194 
    195 
    196 对string类
    197 
    198 调用方法:getline(cin, str);
    199 
    200 #include <iostream>
    201 #include <string>
    202 using namespace std;
    203 
    204 int main()
    205 {
    206     string str;
    207     getline(cin, str);
    208     cout << str << endl;
    209     return 0;
    210 }
    211 /*
    212  * input: 123 456 789
    213  * output: 123 456 789
    214  */
  • 相关阅读:
    parted 2T以上磁盘分区和挂载
    MySQL 表空间恢复
    MySQL 绿色版安装
    EF core
    让vs自动提示没有using的类
    Android Studio 的 Gradle 面板没有 Task
    JMS微服务远程调用性能测试 vs .Net Core gRPC服务
    electron打包,使用electron-packager
    EasyNetQ(RabbitMQ)在处理消息时,如果抛出异常,继续不断发送到订阅队列,不断处理(也就是不自动确认消息已到达)
    调用系统默认浏览器,打开网页
  • 原文地址:https://www.cnblogs.com/ykzou/p/4574975.html
Copyright © 2011-2022 走看看