C/C++字符输入函数(详解)

C/C++字符输入函数(详解)

C/C++实现从终端(包括但不限于键盘,对于嵌入式设备可以是网口/串口)。
C/C++所提供的标准库提供了不下于一种字符输入函数。

1.常用函数(scanf函数)

scanf函数一般格式为scanf(“%s”,(char*) st),scanf默认回车和空格是输入不同组之间的间隔和结束符号,所以输入带空格,tab或者回车的字符串是不可以的。
scanf函数在C++中不建议使用,而建议使用scanf_s函数。该函数对scanf函数提供了输入长度的保障,可以防止因内存越界导致的程序崩溃问题。
那么如果想要利用scanf输入数据时,不被空格或者回车作为结束符怎么做呢?
这里需要利用一下规定扫描集的小技巧:
例如:

scanf("%[a-z A-Z]",char*)st);

这个声明表明输入表明输入只接收a-z和A-Z的字符串。遇到非字母的字符就会停止输入。
那么我们需要完全相反的规定该怎么办?这里就需要用到补集。即^n
例如:

scanf("%[^(a-z A-Z)]",char*)st);

2.cin流控输入

cin是C++所有的输入函数。cin是C++中最常用的输入语句,当遇到空格或者回车键即停止。
其使用方法为:

cin>>(char)a>>" ";

输入格式与变量所定义格式一致。
需要注意的是:
(1)cin>>等价于cin.operator>>(),即调用成员函数operator>>()进行读取数据。
(2)当cin>>从缓冲区中读取数据时,若缓冲区中第一个字符是空格、tab或换行这些分隔符时,cin>>会将其忽略并清除,继续读取下一个字符,若缓冲区为空,则继续等待。但是如果读取成功,字符后面的分隔符是残留在缓冲区的,cin>>不做处理。
(3)不想略过空白字符,那就使用 noskipws 流控制。比如cin>>noskipws(该方法可以用来获取空格输入)。
使用方法如下:

char c;
cin >> noskipws;//设置cin读取空白符
cin >> c

3. gets()函数

可以无限读取,以回车结束读取,C语言中的函数,在C++中运行会产生bug。在C11标准中已被正式删除,建议不要用!!!

4.getline()函数

该函数在<string.h>头文件中。当定义的变量为string类型时(不是char*),从终端输入一整行数据时,使用getline函数更便捷。getline结束符为回车换行,空格或者Tab都不会打断输入。
getline函数用法如下:
其中cin为C++的流控输入流。

getline(cin, str);

5.cin.get (char *str, int maxnum)

cin.get()函数可以接收空格,遇回车结束输入。其函数功能相当于getline。但是cin.get支持以字符型数组作为参数传入,同时可以指定最大输入数量,防止因输入越界导致的内存崩溃。
cin.get使用如下:

char st[50]; 
 cin.get(st,50);

特殊输入函数

1> sprintf():

函数的格式:int sprintf( char *buffer, const char *format [, argument,…] );
该函数常用作将某些数据格式化输入到指定buff中。这里的数据并不是从终端获取,而是程序内部的变量或者常量。
使用方法:

char s[40]; 
sprintf(s,"%s%d%c","test",1,'2'); 
printf("%s%d%c","test",1,'2'); 

程序将会输出:test12。

2> sscanf():

函数功能:读取格式化的字符串中的数据。其功能与sprintf相反,是将字符数组中的数据按照格式化读取。
函数定义在<stdio.h>文件中。

sscanf与scanf类似,都是用于输入的,只是后者以键盘(stdin)为输入源,前者以固定字符串为输入源。
第二个参数可以是一个或多个 {%[*] [width] [{h | I | I64 | L}]type | ’ ’ | ‘\t’ | ‘\n’ | 非%符号}
注:
1、 * 亦可用于格式中, (即 %d 和 %s) 加了星号 () 表示跳过此数据不读入. (也就是不把此数据读入参数中)
2、{a|b|c}表示a,b,c中选一,[d],表示可以有d也可以没有d。
3、width表示读取宽度。
4、{h | l | I64 | L}:参数的size,通常h表示单字节size,I表示2字节 size,L表示4字节size(double例外),l64表示8字节size。
5、type :这就很多了,就是%s,%d之类。
6、特别的:%
[width] [{h | l | I64 | L}]type 表示满足该条件的被过滤掉,不会向目标参数中写入值
失败返回0 ,否则返回格式化的参数个数
7、如果读取的字符串,不是以空格来分隔的话,就可以使用%[]。
返回值:
函数将返回成功赋值的字段个数;返回值不包括已读取但未赋值的字段个数。 返回值为 0 表示没有将任何字段赋值。 如果在第一次读取之前到达字符串结尾,则返回EOF。

sscanf使用方法如下:

include <stdio.h>    
int main( void )  {
     char  tokenstring[] = "15 12 14...";
     char  s[81];
     char  c;
     int   i;
     float fp;
       // Input various data from tokenstring:
     // max 80 character string:
     sscanf( tokenstring, "%80s", s ); // C4996
     sscanf( tokenstring, "%c", &c );  // C4996
     sscanf( tokenstring, "%d", &i );  // C4996
     sscanf( tokenstring, "%f", &fp ); // C4996
     // Note: sscanf is deprecated; consider using sscanf_s instead 
      // Output the data read
     printf( "String    = %s\n", s );
     printf( "Character = %c\n", c );
     printf( "Integer:  = %d\n", i );
     printf( "Real:     = %f\n", fp );
  }  

其输出为:
String = 15 Character = 1 Integer: = 15 Real: = 15.000000

上章题解:

问题:通过灵活输入原字符串,需要替换的字符换,需要被替换的字符串,并输出结果。

直接上代码:
完整例程下载:DownLoad


#include <iostream>
#include <string>
#include <regex>
#include <stdio.h>
using namespace std;
int main() {
    string str ;
    string str_regx;
    string str_beReplaced;
    regex pattern("Bad");
    cout << "请输入原字符串!\n";
    getline(cin, str);
    cout << "请输入要替换的字符\n";
    getline(cin, str_regx);
    pattern.operator=(str_regx);
    cout << "请输入要替换的字符\n";
    getline(cin, str_beReplaced);
    cout << regex_replace(str, pattern, str_beReplaced) << endl;
    return 0;
}

有个问题,如何以scanf_s来实现这个目标呢?有大神还请不吝赐教

  • 5
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: memset()函数是C/C++语言中的一个库函数,可以用于将一段内存空间的内容设置为指定的值。 memset()函数的原型为: ```c void *memset(void *s, int c, size_t n); ``` 其中,s是指向要设置的内存的指针;c是要设置的值,通常是一个无符号字符或者零;n是要设置的内存空间的大小。 memset()函数的作用是将一段内存空间的每个字节都设置为相同的值。可以用于初始化内存,或者将内存中的内容清零。 使用memset()函数需要注意以下几点: 1. memset()函数只能用于字符数据类型或者无符号整型数据类型,即只能设置1字节大小的值。 2. 使用memset()函数时,需要知道要设置的内存空间的大小,以防止超出边界进行内存越界操作。 3. memset()函数是按字节进行设置的,所以对于非字符类型数据(如整数或浮点数),可能造成数据不符合预期。 示例代码: ```c #include <string.h> int main() { int arr[5]; memset(arr, 0, 5 * sizeof(int)); // 将arr内存空间设置为0 char str[20]; memset(str, 'A', 19); // 将str内存空间设置为'A' str[19] = '\0'; // 末尾添加'\0',形成一个字符串 return 0; } ``` 总之,memset()函数是一个能快速设置内存空间内容的函数,可以方便地进行内存初始化和内存清零操作。 ### 回答2: memset()函数C语言中的一个库函数,其原型如下: void *memset(void *ptr, int value, size_t num); memset()函数的作用是将指定内存空间的值设置为指定的值。其中,ptr表示要设置的内存空间的起始地址,value表示要设置的值,num表示要设置的字节数。 memset()函数的返回值为void指针类型,即可以接受任何类型的指针。 使用memset()函数可以在一次调用中批量设置内存空间的值,提高效率和代码的简洁度。 例如,下面的代码片段就是使用memset()函数将数组arr中的所有元素设置为0: int arr[10]; memset(arr, 0, sizeof(arr)); 由于memset()函数设置的是字节数据,所以在设置非字符类型数据时需要小心。以一个int型数组arr为例,使用memset()函数将其所有元素设置为-1可能会出现错误。因为在某些机器上,-1的二进制表示并不是所有字节全为1,这会导致memset()函数设置的结果并非预期。 对于字符数组或字符串,可以使用memset()函数设置为0,即'\0',也可以使用strcpy()函数进行单个字符赋值,这样更为安全可靠。 总之,memset()函数是一个实用的函数,可以批量设置内存空间的值,提高代码的执行效率和简洁度。在使用时,需要注意数据类型和数据源的合法性,以避免出现错误。 ### 回答3: memset()函数是C/C++语言中的一个库函数,主要用来对一段指定内存空间进行初始化。 其函数原型为: void* memset(void* ptr, int value, size_t num); 第一个参数ptr是一个指向某一块内存区域的指针,用来指定待初始化的内存空间。 第二个参数value是一个整数值,用来指定待初始化的值,其中最常用的是0。 第三个参数num是一个整数值,用来指定待初始化的内存空间的字节数。 memset()函数的作用是将ptr指向的内存空间中的每个字节都设置为value指定的值。一般来说,value为0时,可以用来将内存空间清零。 memset()函数通常用于对数组、字符串或结构体等数据类型的初始化。例如,当我们声明一个数组或字符串后,需要将其所有元素或字符都初始化为0,可以使用memset()函数。 以下是一个使用memset()函数进行数组初始化的示例: int num[5]; memset(num, 0, sizeof(num)); 以上代码将会把num数组的所有元素都初始化为0。 需要注意的是,memset()函数只能用来设置每个字节的值,并不能对较大的数据块进行初始化。此外,在使用memset()函数时,需要确保待初始化的内存空间不受限制并且是可访问的,否则可能会引发错误。 总结起来,memset()函数是C/C++中常用的一个函数,主要用来对一段指定的内存空间进行初始化,提高程序的可读性和可维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值