gets函数,从标准输入读取一行文本,一行输入由一串字符组成,以一个换行符结尾;

gets函数丢弃换行符,并在该行的末尾存储一个NUL字符(类似‘\0’), 然后返回一个非NULL值。

当gets函数被调用但事实上不存在输入行时,它返回NULL值。

注意点:给字符串分配空间加NUL的空间;

格式字符串包含格式指定符(格式代码)以及普通字符,这些普通字符将按照原样打印出来;

但每个格式指定符将使后续参数的值按照它所指定的格式打印。

%d  十进制打印;   %g  打印浮点值;

%o  八进制打印;     %c   打印一个字符;

%x  十六进制打印;  %s  打印一个字符串;

scanf()函数返回值是函数成功转换并存储于参数中的值个数;

perror函数以一种简单、统一的方式报告错误,perror函数简化向用户报告这些特定错误的过程,它的原型定义于stdio.h

void perror(char  const  *message);

如果message不是NULL并且指向一个非空的字符串。perror函数就打印出这个字符串,后面跟一个分号和一个空格。

然后打印出一条用于解释errno当前错误代码的信息;

终止执行:

exit函数,用于终止一个程序的执行,它的原型定义于stdlib.h

void  exit(int  status);

该函数的返回值为void;

就c程序而言,所有的I/O操作只是简单地从程序移进或移出字节的事情。 因此,毫不惊奇的是,这种字节流便称为流(stream);

程序只需要关心创建正确的输出字节数据,以及正确地解释从输入读取的字节数据,特定I/0设备的细节对程序员是隐藏;

流分为两种类型:文本(text)流 和二进制(binary)流;

stdio.h所包含的声明之一就是FILE结构。请不要把它和存储于磁盘上的数据文件相混淆。

FILE是一个数据结构,用于访问一个流,如果你同时激活量几个流,每个流都有一个相应的FILE与它关联,为了流上执行一些操作,你调用一些

合适的函数,并向它们传递一个与这个流相关联的FILE参数;

EOF: end of file , 它的实际值比一个字符要多几位,这是为了避免二进制值被错误地解释为EOF;

I/O函数以三种基本的形式处理数据:单个数据、文本行、二进制数据;

对于每种形式,都有一组特定的函数对它们进行处理。

  数据类型    输入    输出    描述

  字符      getchar   putchar   读取(写入)单个字符

  文本行       gets    puts    文本行未格式化的输入(输出)

          scanf   printf    格式化的输入(输出)

  二进制数据   fread   fwrite    读取(写入)二进制数据

字符I/O宏

  fgetc 和 fputc 是真正的函数,但getc、putc、getchar 和putchar 都是通过#define 指令定义的宏;

撤销字符I/O

  int ungetc(int character,   FILE*  stream);

  功能:ungetc 把 一个先前读入的字符返回到流中,这样它可以在以后被重新读入;

(应用:假如你必须从一个流中逐个读入一串数字,由于在实际读入之前,你无法知道下一个字符,你必须连续读取,直到读入一个非数字字符,

  但是如果你不希望丢弃这个字符,那么你该怎么办?

  使用ungetc把读入的字符退还给流,是一个不错的办法)

  “退回”字符和流的当前位置有关,所以如果 用 fseek、 fsetpos、 rewind 函数改变了流的位置, 所有退回的字符都将被丢弃;

scanf家族:

  scanf函数家族的原型如下所示,每个原型中的省略号表示一个可变长度的指针列表;

从输入转换而来的值逐个存储到这些指针参数所指向的内存位置;

  int  fscanf(FILE *stream,  char const  *format,  ... );

  int scanf(          char const *format,  ... );

  int  sscanf(char  const *string,  char  const * format,  ... );

这些函数都从输入源读取字符串并根据format字符串的格式代码对它们进行转换。

fscanf的输入源  就是作为参数给出的流。

 scanf从标准输入读取,

sscanf从第1个参数所给出的字符串中读取字符;

  对于scanf函数的参数前面为什么要加一个&符号?由于c的传值参数传递机制,把一个内存位置作为参数传递给函数的唯一方法是传递一个指向该位置的指针; 在使用scanf函数时,一个非常容易出现的错误是忘记加&符,省略这个符号将导致变量的值作为参数传递给函数,

   而scanf函数(或者其它两个)却把它解释为一个指针,当它被解引用时,要么导致程序终止(试图修改非法的地址);要么导致一个不可预测的内存位置的数据被修改;

   sscanf函数说明:int  sscanf(const char  *str,  const  char * format,  .......);

  sscanf()会将参数str的字符串(一定要是字符串), 根据参数format来转换并将格式化数据,转换后的结果存于对应的参数内;

返回值: 成功则返回参数数目, 失败则返回-1;错误原因存于errno中。返回0表示失败,否则,表示正确格式化数据的个数。

  例如:sscanf(str ,   "%d %d %s",  &i, &i2,  &s);  如果三个均成功返回3, 如果只读入了第一个整数到i则会返回1,证明无法从str读入第二个整数;

char input[] = "10.10.aaaaaa.bbbbbb";

sscanf(input,  "%d.%d.%5[a-z] %*s %f”,&i,&j,s,s);

printf(“%d %d %s ”,i,j,s);

执行: 10 10 aaaaa

  常见用法:

    char  str[512] = {0};

    sscanf("123456", "%s", str);
    printf("str=%s", str);

    2.取指定长度的字符串。如下:

       sscanf("123456", "%4s", str);

        printf("str = %s", str); 

    3. 取到指定字符为止的字符串。如在下例中,取遇到空格为止字符串。  //验证有问题,还是没明白其意思呢

        sscanf("123456abcdedf","%[^]",str);

        printf("str=%s", str);

    4、取仅包含指定字符集的字符串,如下,取仅包含1到9和小写字母的字符串;

        sscanf("123456abcdedfBCDEF","%[1-9a-z]",str);

        printf("str=%s",str);

    5、取到指定字符集为止的字符串,如下,取遇到大写字母为止的字符串;

        sscanf("123456abcdedfBCDEF","%[^A-Z]", str);
        printf("str=%s",str);

***************************************************************

  可以用如下代码将字符串形式的ip地址转换为四个整数:

  1. char * inputIp
  2. int ip[4];
  3. sscanf_s(inputIp, "%d.%d.%d.%d", &ip[0], &ip[1],&ip[2],&ip[3]);

以下部分还没用到:

注意sscanf_s,当读入的类型是整数或其它长度可以确定的类型时,不能在类型后面跟上长度,但是对于字符串类型(char *)长度无法得知则必须在类型后面明确指出字符串的最大长度(即可以容纳的空间)。举例如下:  

 // crt_sscanf_s.c
// This program uses sscanf_s to read data items
// from a string named tokenstring, then displays them. #include <stdio.h>
#include <stdlib.h> int main( void )
{
char tokenstring[] = "15 12 14...";
char s[];
char c;
int i;
float fp; // Input various data from tokenstring:
// max 80 character string plus NULL terminator
sscanf_s( tokenstring, "%s", s, _countof(s) );
sscanf_s( tokenstring, "%c", &c, sizeof(char) );
sscanf_s( tokenstring, "%d", &i );
sscanf_s( tokenstring, "%f", &fp ); // Output the data read
printf_s( "String = %s\n", s );
printf_s( "Character = %c\n", c );
printf_s( "Integer: = %d\n", i );
printf_s( "Real: = %f\n", fp );
}

对于多个字符串读入的情况,代码如下:

  1. sscanf_s(inputString, "%s.%s.%s.%s", s1, s1.length, s2, s2.length, s3, s3.length, s4, s4.length);

 

c语言中重要函数的更多相关文章

  1. C语言中的函数

    C语言中的函数 目录 概述——对函数的理解 C语言中函数的定义和声明 函数允许的参数类型 函数允许的返回类型 递归 概述 由于有些代码段在编写程序的时候经常会用到,此时我们为了减少代码文件的长度和增加 ...

  2. 想精度高,可以考虑用c语言中的函数gettimeofday

    大家好: 在 win32 + bcb 时, 有个 GetTickCount() 返回第统启动到现在的 tick, 单位 ms.请问在 Linux + qt5 怎样实现呢? 如果用 QDateTime ...

  3. C语言中的函数指针

    C语言中的函数指针 函数指针的概念:   函数指针是一个指向位于代码段的函数代码的指针. 函数指针的使用: #include<stdio.h> typedef struct (*fun_t ...

  4. 利用C语言中的函数指针实现c++中的虚函数

    C语言中的函数指针 #include<stdio.h> int fun1(int a) { return a*a; } int fun2(int a) { return a*a*a; } ...

  5. js课程 3-10 js中字符串函数数组函数和其它语言中对应函数的区别和联系是什么

    js课程 3-10  js中字符串函数数组函数和其它语言中对应函数的区别和联系是什么 一.总结 一句话总结:js中是对象点方法的形式,这些方法都是对象的方法,而在php.java中却不是这样. 1.j ...

  6. C语言中的函数与数学上的函数很类似

    函数,是C语言编程中一个很重要的概念,重要到个人认为可以与指针并驾齐驱.好多教材.老师.学习资源都会专门挑出一章来讲函数.我今天也来说说函数,只不过我是从数学课上的函数来引申到C语言中的函数. 先来说 ...

  7. 策略设计模式与c语言中的函数指针

    在C语言中有一个非常重要的概念-函数指针,其最重要的功能是实现回调函数(指函数先在某处注册,而它将在稍后某个需要的时候被调用)在java语言中没有指针的概念,但是可以利用接口和指针实现类似的功能,具体 ...

  8. 1、C语言中的函数指针

    一 通常的函数调用 void MyFun(int x); //此处的申明也可写成:void MyFun( int ); int main(int argc, char* argv[]) { MyFun ...

  9. C语言中的函数、数组与指针

    1.函数:当程序很小的时候,我们可以使用一个main函数就能搞定,但当程序变大的时候,就超出了人的大脑承受范围,逻辑不清了,这时候就需要把一个大程序分成许多小的模块来组织,于是就出现了函数概念:  函 ...

  10. 初识C语言中的函数(男神翁凯老师MOOC)

    什么是函数? 函数是一块代码,接收零个或多个参数,做一件事情,并返回零个或一个值. 可以先想象成数学中的函数: y=f(x) 例如 求begin到end和的函数定义 void sum(int begi ...

随机推荐

  1. str系列---字符串函数

    1. strcat extern char *strcat(char *dest,char *src); 把src所指字符串添加到dest结尾处(覆盖dest结尾处的'\0')并添加'\0'. 返回指 ...

  2. cad2007 钢筋符号显示为问号

    如题:cad2007 钢筋符号显示为问号 解决办法:下载Tssdeng,解压(Tssdeng.rar) 把下载到的cad大字体Tssdeng.shx文件放到autoCAD2007安装目录C:\Prog ...

  3. 9.java.lang.ClassCastException

    java.lang.ClassCastException 数据类型转换异常 当试图将对某个对象强制执行向下转型,但该对象又不可转换又不可转换为其子类的实例时将引发该异常,如下列代码. Object o ...

  4. AndroidAutoLayout 屏幕适配

    https://github.com/hongyangAndroid/AndroidAutoLayout

  5. perl 解json数组

    <pre name="code" class="cpp">http://11.36.10.82:4000/api/bus?bus=307&f ...

  6. mongodb的 或 查询,实践总结

    PostcardRecord.findOne({user:userid, $or : [ { at:{$gte:start.valueOf(), $lte:end.valueOf()} } , { i ...

  7. Swift 闭包表达式

    闭包是功能性自包含模块,可以在代码中被传递和使用. Swift 中的闭包与 C 和 Objective-C 中的 blocks 以及其他一些编程语言中的 lambdas 比较相似. 闭包的形式主要有三 ...

  8. JavaScript之firstChild属性、lastChild属性、nodeValue属性学习

    1.数组元素childNodes[0]有更直观易读的优点,这边在介绍一个有同样功能的属性,且更加语义化-------->firstChild属性 假设我们需要目标元素节点下的所有子元素中的第一个 ...

  9. 在Windows7防火墙允许指定的端口

    在xp系统的时代,修改防火墙很方便,很简单.windows7或许是做得过于复杂了.当然所谓安全性也是相当于其他之前版本的系统更高了.为什么要打开端口,肯定是在windows7下启动了网络服务,需要开启 ...

  10. hive 分配map数过少导致任务执行慢

    数据表大概150M,但是只有几个字段,导致行数特别多,当使用正则表达式去匹配时执行较慢. 解决思路:增大map数; //设置reduce数为150,将原表分成150份,map数无法直接设置,因为和输入 ...