精华内容
下载资源
问答
  • C语言字符串输入函数的比较与解析

    千次阅读 多人点赞 2014-07-31 15:32:58
    在做ACM题时经常会被一些字符串输入搞得

           许多ACMer在做ACM题时经常会被一些字符串输入搞混,如果认为几个字符串输入函数的功能基本一样那就大错特错了。今天把C语言中的三个字符串输入函数(scanf,gets,fgets)深入分析一下,以至于不要让太多ACMer字符串输入的阴沟里翻船。(只讨论在命令行中的标准输入)


           首先讨论一下最常见的scanf输入字符串。众所周知,使用scanf("%s")输入字符串有一个显著特点就是字符串中不能有空格,回车,以及制表符等空白字符。因为scanf遇到空白字符就结束字符串输入。下面请看这段代码:

    #include <stdio.h>
    #include <string.h>
    #define N 20
    
    int main()
    {
        char str[N];
        scanf("%s", str);
        printf("%s\n", str);
        return 0;
    }
    编译运行后当你输入“abc def”后会怎么样?程序会得出怎样的结果?下面是我的测试结果

    这说明了什么?scanf确实无法读取带有空白字符的字符串。因此在需要读取带空白字符的字符串时使用scanf是一种不明智的选择。


           接下来我讲一个scanf函数一个十分重要的特性:在命令行中用scanf函数做标准输入,只要你是以换行符(也就是回车键)结束输入并且你不是用scanf读取单个字符,那么这个换行符就会被放到输入缓冲区中。如果你的下次输入是输入字符时或者使用gets等函数输入字符串时,你的下次输入就可能会被影响。接下来做个试验,请看这段代码:

    #include <stdio.h>
    #include <string.h>
    #define N 20
    
    int main()
    {
        char str[N];
        char ch;
        scanf("%s", str);
        printf("%s\n", str);
        ch = getchar();
        printf("%d\n", ch);
        return 0;
    }
    
    编译运行之后我输入“abc”再按回车结束输入,下面是我的测试结果

    我用字符变量ch接受后续字符输入再打印该字符的ASCII码值,该字符ASCII码值为10,正好是换行符的ASCII码。光是scanf输入字符串还不够,我们应该试试使用scanf函数输入别的比如整数浮点数之类的来试试,这个试验我就不再在这里一一写代码。我试验过,结果还是一样:输出ch的ASCII码值还是10。说明scanf函数做输入以换行符结束会留下这个换行符在输入缓冲区而不是把这个换行符清除掉。当然我想说在这一种情况下scanf后面就没有换行符了,请看这段代码

    #include <stdio.h>
    #include <string.h>
    #define N 20
    
    int main()
    {
        char str[N];
        char ch;
        scanf("%s", str);
        printf("%s\n", str);
        scanf("%c", &ch);
        printf("%d\n", ch);
        ch = getchar();     //读取第二个scanf后面的残留字符,实际上没有
        printf("%d\n", ch);
        return 0;
    }
    
    运行后使用和上面一样的输入,结果还是和上面一样的输出。

    但是不同的是,程序结束,而是再等待输入,因为第一个scanf输入后留下的换行符被第二个scanf读取了,而换行符之后并没有后续输入,因此getchar函数在等待输入中。说明:并不是scanf生成换行符放在输入缓冲区,而是用户输入的换行符没有被scanf吃掉因此残留在缓冲区而已。


           接下来gets函数了。当我们需要读取带有空白字符的字符串时基本上非gets函数莫属了,gets函数恰好是专门读取有空白字符的字符串的。实际上gets函数一直读到换行符才停止。试验代码如下:

    #include <stdio.h>
    #include <string.h>
    #define N 20
    
    int main()
    {
        char str[N];
        char ch;
        gets(str);
        printf("%s\n", str);
        printf("%c\n", str[strlen(str)-1]);     //输出字符串str最后一个字符,非'\0'
        ch = getchar();
        printf("%d\n", ch);
        return 0;
    }
    
    当我输入一个字符串“I am a student”后按回车键结束输入得到的结果是这样的


    等待输入的是ch字符,说明gets函数输入字符串并没有像scanf函数一样留下一个换行符在输入缓冲区中。那么难道这个换行符被读到字符串中了?不!因为输出字符串最后一个字符发现这个字符并不是换行符而是字母‘t',这正好是我输入字符串的最后一个字符。说明gets函数会把换行符吃掉但是却并没有放在字符串中,相当于一个会读非换行符的空白字符的scanf函数加一个getchar的功能。


           下面,我们来看一下scanf和gets交替使用来读取字符串的现象。试验代码如下:

    #include <stdio.h>
    #include <string.h>
    #define N 20
    
    int main()
    {
        char str1[N];
        char str2[N];
        char ch;
        scanf("%s", str1);
        gets(str2);
        printf("str1=%s;\n", str1);
        printf("str2=%s;\n", str2);
        ch = getchar();
        printf("ch = %d\n", ch);
        return 0;
    }
    
    我打算先输入“student”后按下回车键再输入另一个字符串的,可是当我输入完“student”并按下回车后第二个字符串就已经输入完毕了,现象如下:

    很明显等待输入的是getchar函数并且字符串str2是一个空串(也就是直接就是字符串结束符'\0'的字符串,长度为0)。我们不妨根据之前得到的结论解释一下这是为什么:scanf函数留下了换行符在输入缓冲区中并且被gets函数读入,因为gets函数遇到换行符才结束字符串的输入,而换行符之前的字符已经被scanf函数读走了,因此gets函数读到的就是一个空字符串了,并且gets函数会吃掉换行符且不会把它放进字符串中,因此目前的getchar函数还在等待输入的状态。事实上你不妨做个试验使用gets函数输入字符串的时候你只按一个回车键,那么你gets函数读到的就是空字符串。很明显的一个结论就是:scanf函数是不可能读到空字符串的,因为它不会读取空白字符,因此会不停的等待输入直到有非空白字符为止。


           下面我们讲第三个字符串输入函数fgets了,fgets本来是文件的输入函数,但是也可以用于标准输入,它比gets函数的优势就是它能限制字符串输入的长度,避免了缓冲区溢出,有许多网络攻击都属于缓冲区溢出攻击。换而言之就是说fgets函数比gets函数安全。我们依旧使用前面的试验代码,只是将gets换成fgets,代码如下:

    #include <stdio.h>
    #include <string.h>
    #define N 20
    
    int main()
    {
        char str1[N];
        char str2[N];
        char ch;
        scanf("%s", str1);
        fgets(str2, sizeof(str2), stdin);
        printf("str1=%s;\n", str1);
        printf("str2=%s;\n", str2);
        ch = getchar();
        printf("ch = %d\n", ch);
        return 0;
    }
    
    还是一模一样的输入,当输入“student”按回车后fgets就已经完成了输入,这说明fgets和gets函数还是很像的,但是有一个地方不一样,看看我的结果:


    很明显等待输入的还是getchar函数,但是字符串str2却和之前不一样了,应该说fgets函数把换行符加到字符串里面去了,str2并不是一个空字符串,而是一个只有一个换行符的字符串,如果你输出str2的长度你就会发现它的长度是1。fgets与gets在输入字符串中除了限制输入字符串的长度以外的主要区别就在于fgets会将换行符读取到字符串里面而不是像gets函数那样将换行符销毁。


           至此,这三个C语言的字符串输入函数的分析与比较就结束了,如果有人还发现了什么别的玄机、、、不要忘记分享哦、、

    展开全文
  • C语言字符串函数大全C语言字符串函数大全C语言字符串函数大全C语言字符串函数大全C语言字符串函数大全C语言字符串函数大全C语言字符串函数大全C语言字符串函数大全C语言字符串函数大全C语言字符串函数大全C语言字符...
  • C语言字符串输入输出函数

    千次阅读 多人点赞 2020-03-21 18:36:15
    C语言字符串输入输出函数 (1)putchar()函数 格式: putchar© 功能:向终端输出一个字符 注意:输出的时候不会加回车 (2) getchar()函数 格式:字符型变量=getchar () 功能:从标准输入设备上读取单个字符,返回值...

    putchar()函数

    • 格式: putchar( c )
    • 功能:向终端输出一个字符
    • 注意:输出的时候不会加回车

    getchar()函数

    • 格式:字符型变量=getchar ()
    • 功能:从标准输入设备上读取单个字符,返回值为字符。
      例:
      在这里插入图片描述

    puts()函数

    • 格式: puts(s);
    • 功能: 向标准输出设备输出已经存在的字符串,并换行(puts()把最后的’\0’变成’\n’)。

    gets()函数

    • 格式:gets(s);
    • 功能:读取标准输入设备输入的字符串,直到遇到回车键结束。
    • 注意:这和scanf()函数读取有区别的,scanf()函数在读取的时候遇到,空格 , \t ,\n 都结束读取,而gets()只是遇到回车(\n)结束读取。
    • 特别注意:gets()函数不会对接受的字符串的buffer进行边界检测,会造成越界从而产生bug。
      可以用fgets()。例:fgets(s,10,stdin); 最多读取9个字符到s,fgets()会默认的给最后加一个’ \0 '。
      例:
      在这里插入图片描述

    getche()函数

    • 需要头文件 conio.h
    • 格式:字符型变量=getche()
    • 功能:输入一个字符后会立即读取,不用等待用户按下回车键,返回值为字符。(带回显)

    getche() 就比较有意思了,它没有缓冲区,输入一个字符后会立即读取,不用等待用户按下回车键,
    这是它和 scanf()、getchar() 的最大区别。

    getch()函数

    • 需要头文件 conio.h
    • 格式:字符型变量=getch()
    • 功能:输入一个字符后会立即读取,不用等待用户按下回车键,返回值为字符。(不带回显)

    getch() 也没有缓冲区,输入一个字符后会立即读取,不用按下回车键,这一点和 getche() 相同。getch() 的特别之处是它没有回显,看不到 输入的字符。所谓回显,就是在控制台上显示出用户输入的字符;没有回显,就不会显示用户输入的字符,就好像根本没有输入一样。

    回显在大部分情况下是有必要的,它能够与用户及时交互,让用户清楚地看到自己输入的内容。但在某些特殊情况下,我们却不希望有回 显,例如输入密码,有回显是非常危险的,容易被偷窥。
    例:
    在这里插入图片描述
    在这里插入图片描述
    getche() 和 getch() 不是标准函数,只能用于 Windows。

    展开全文
  • C语言字符串操作函数.docx
  • C语言字符串处理函数整理版本,包含字符串基本操作,字符串类型转换、字符检查、输入输出流、输入输出流分割、异常处理等
  • c语言字符串函数大全

    2012-04-15 22:33:35
    c语言字符串函数大全 c语言字符串函数大全 c语言字符串函数大全 c语言字符串函数大全
  • C语言字符串函数大全

    2011-04-22 14:20:37
    C语言字符串函数大全C语言字符串函数大全C语言字符串函数大全C语言字符串函数大全
  • C语言字符串输入及输出的几种方式

    万次阅读 多人点赞 2018-02-06 00:12:56
    1.字符串数组+初始化 char s1[]="array"; //字符数组 char s2[6]="array"; //数组长度=字符串长度+1,因为字符串末尾会自动添‘\0‘ printf("%s,%c\n",s1,s2[2]); //array,r 2.字符串指针+初始化 char *sp=...

    1.字符串数组+初始化

    char s1[]="array";  //字符数组
    char s2[6]="array";  //数组长度=字符串长度+1,因为字符串末尾会自动添‘\0‘
    printf("%s,%c\n",s1,s2[2]);  //array,r

    2.字符串指针+初始化

    char *sp="pointer";  //字符指针
    printf("%s,%c,%c\n",sp,*sp,*(sp+2));  //pointer,p,i
    3.数组+scanf

    char s1[6];	
    scanf("%s\n",s1);
    printf("%s,%c\n",s1,s1[2]);  //array,r
    4.指针+scanf
    #include <stdio.h>
    #include<stdlib.h>   //该头文件别忘加,否则使用malloc会报错
    int main(){
      char *sp;
      sp=(char *)malloc(sizeof(char));
      scanf("%s\n",sp);
      printf("%s,%c\n",sp,*sp);//pointer,p
      return 0;
    }
    5.指针+数组+scanf

    char str[60], *sp=str;//将数组的首地址str赋给指针变量sp
    scanf("%s\n",sp);
    printf("%s,%c,%c\n",sp,*sp,*(sp+3));//pointer,p,n
    printf("%s,%c,%c\n",str,str[0],str[3]);//pointer,p,n
    6.注意:如下方法控制台运行会终止

    char *sp;//sp未初始化指向不明
    scanf("%s\n",sp);
    printf("%s\n",sp);
    7.用scanf和gets( 字符数组名或指针)进行输入的区别:

    char str1[60],str2[60];
    gets(str1);  //gets()函数将接收输入的整个字符串直到遇到换行为止
    printf("%s\n",str1);
    scanf("%s\n",str2);//scanf如果输入了空格会认为字符串结束,空格后的字符将作为下一个输入项处理
    printf("%s\n",str2);

    8.使用while(scanf("%d",&n)!=EOF){ }实现多组测试数据输入,而不在输入完一组数据后退出控制台

    char s1[60],s2[60];
    int cnt; //用来测试scanf返回被输入函数成功赋值的变量个数
    while((cnt=scanf("%s%s",s1,s2))!=EOF){  //当按下ctr+z终止输入时,scanf会返回EOF(-1)\n
       printf("scanf返回了%d, s1是%s,s2是%s, 这行输出下方可以继续进行输入\n",cnt,s1,s2);
       //scanf若成功输入str1和str2则返回2
    }
    printf("%d",cnt);//当按下ctr+z后会执行该条输出-1
























    展开全文
  • C语言字符串替换函数strrpl支持中文汉字,解决含中文汉字,可能替换错误的情况。支持GBK、GB18030字符串。
  • c语言字符串分割函数

    千次阅读 2018-06-13 14:38:40
    C语言字符串分割strsep函数用于分解字符串为一组字符串。定义语句为char *strsep(char **stringp, const char *delim);使用实例:#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &...

    C语言字符串分割

    strsep函数用于分解字符串为一组字符串。定义语句为char *strsep(char **stringp, const char *delim);

    使用实例:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main()
    {
        char str[] = "$GPFPD,2005,266904.450,274.162,-1.111,0.504,40.1917161,116.0636047,132.93,0.011,-0.002,0.003,-1.000,16,13,0B*21";
        
        char *buf;
        buf =str;
    
        printf("buf=%s\n",buf);
        char *token;
        while((token = strsep(&buf,",")) != NULL)
        {
    	printf("%s\n",token);
        }
       	 
        return 0;
    
    }
    

    输出结果:

    buf=$GPFPD,2005,266904.450,274.162,-1.111,0.504,40.1917161,116.0636047,132.93,0.011,-0.002,0.003,-1.000,16,13,0B*21
    $GPFPD
    2005
    266904.450
    274.162
    -1.111
    0.504
    40.1917161
    116.0636047
    132.93
    0.011
    -0.002
    0.003
    -1.000
    16
    13
    0B*21
    



    展开全文
  • C语言字符串处理函数

    千次阅读 2015-08-30 06:56:53
    C语言字符串处理函数库包括复制函数、拼接函数、比较函数、搜索函数等,这些函数的声明都位于头文件。使用这些函数时,需要使用#include指令将头文件包含到文件中。
  • C语言字符串输入与输出函数

    万次阅读 多人点赞 2015-01-15 14:57:49
    字符串输入&输出
  • 郭天祥C语言字符串函数功能简介郭天祥C语言字符串函数功能简介郭天祥C语言字符串函数功能简介
  • C语言字符串处理函数

    千次阅读 2019-03-04 19:51:51
    main(int argc,char* argv[ ]) argc是命令行总的参数个数 argv[]是argc个参数,其中第0个参数是程序的全名,以后的参数命令行后面跟的用户输入的参数, ...字符串切割函数 (strtok) 函数原型:char ...
  • C语言字符串分割函数split实现

    千次阅读 2018-01-20 13:25:55
    参考了到处是“坑”的strtok()—解读strtok()的隐含特性这一篇博文, 概括来说...不过怎么说多多少少有些缺陷,用起来不是很满意,因此自己动手实现了一个类似java中split的字符串分割函数,如下: #include #include
  • //字符串替换函数,在字符串 string 中查找 source, 找到则替换为destination,找不到则返回NULL static char * replace_string (char * string, const char * source, const char * destination ) { char* sk = ...
  • C语言字符串输入函数gets_s()

    千次阅读 2020-06-26 21:11:33
    C语言字符串输入函数gets_s() C11新增了gets_s()函数(可选),和fgets()函数类似(上一篇博客有介绍《 C语言字符串输入fgets()函数 》),用一个参数限制读入的字符数。gets_s()函数的形式如下: gets_s(words...
  • C语言 字符串逆序 函数 strrev()

    千次阅读 2019-05-17 15:06:12
    头文件 #include <string.h> 函数原型 char *strrev(char *str); 功能 把字符串str的所有字符的顺序颠倒。(逆序) 示例
  • C语言字符串函数参数

    千次阅读 2020-10-30 09:03:15
    一维字符串内存模型:两种 void copy_str01(char *from, char *to) { for (; *from!=’\0’; from++, to++) { *to = *from; } *to = ‘\0’; } void copy_str02(char *from, char *to) { while(*from!=’\
  • c语言字符串输入

    万次阅读 多人点赞 2018-08-28 10:56:36
    如果想把一个字符串读入程序,首先必须预留储存该字符串的空间,然后用输入函数获取该字符串。 分配空间 1.char *name; 2.char name[81];   1,2 的不同点:1.的指针在未进行初始化之前可能指向任何地方。  ...
  • C语言字符串复制函数

    千次阅读 2011-11-26 00:08:12
    要求逆序输出输入字符串,并且不能用第三方变量,函数的原型是 char* strNCopy(const char* source,char* dest)要求不用库函数, 根据要求我写了这样一段程序: #include #include char* strNCopy(const ...
  • C语言字符串截取函数strtok和strtok_r

    万次阅读 2015-07-29 21:42:29
    在看源码的时候需要将一段并排的IPs转化成为一系列的IP,将"10.0.0.1;10.0.0.2;10.0.0.3;10.0.0.4;...就是一个将一个字符串切割成为多个字符串的问题。考虑C语言中的strtok以及strtok函数。 1.s...
  • C语言字符串读取函数 gets()与fgets()

    千次阅读 2017-03-09 14:22:12
    c语言中读取字符串有多种方法,比如scanf() 配合%s使用,但是这种方法只能获取一个单词,即遇到空格等空字符就会返回。如果要读取一行字符串,比如:I love BIT这种情况,scanf()就无能为力了。这时我们最先想到的...
  • C语言字符串输入输出

    万次阅读 多人点赞 2018-01-26 21:30:39
    C语言中,输出字符串函数有两个: puts():直接输出字符串,并且只能输出字符串。printf():通过格式控制符 %s 输出字符串。除了字符串,printf() 还能输出其他类型的数据。 这两个函数前面已经讲过了,...
  • C语言字符串输入

    千次阅读 2018-11-18 00:49:17
    如果想把一个字符串读入程序,首先必须预留存储该字符串的空间,然后用输入函数获取该字符串。 1.分配空间 要做的第一件事是分配空间,以储存稍后读入的字符串。 假设编写了如下代码: char *name; scanf("%s...
  • scanf虽然也能输入字符串,但是遇到空格就停止了。 解决方法: 目的:输入字符串可以有空格,且,会检测是否溢出,如果溢出,将其截断。 也可以设置你想要获取的字符个数,将超出此范围的字符截断...
  • c语言字符串函数详解--函数名及源代码整理

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 268,869
精华内容 107,547
关键字:

c语言字符串输入函数

c语言 订阅