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. android ndk jni 环境搭建

    关于ndk jni网上的介绍很多,其实我了解这个主要是因为自己是做嵌入式的,一则是对C语音有感情  二则是知道jni  可以绕过framework 框架直接操作硬件抽象层. 1.概述 对于ndk, j ...

  2. TLSAlloc()

    为什么要有TLS?原因在于,进程中的全局变量与函数内定义的静态(static)变量,是各个线程都可以访问的共享变量.在一个线程修改的内存内容,对所有线程都生效.这是一个优点也是一个缺点.说它是优点,线 ...

  3. sql优化-总结

    1.尽量缩小数据范围. 2.能一个sql解决的,坚决不用两条sql.利用case when或decode. select month_id, corppkno, sum(exportSum_new) ...

  4. _sortBy用法

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  5. Java反射-简单应用

    为了程序更好的维护和扩展,在面向对象思维的世界里,首先是面向接口编程,然后我们应该把做什么和怎么做进行分离. 以下我将用一个开晚会的样例来演示一下,终于达到的效果是:工厂+反射+配置文件实现程序的灵活 ...

  6. jquery数字验证大小比较

    $("#rewardForm").validate({            rules: {                "reward": {       ...

  7. jquery JS 左右方向键

    $(function (){ // $(document).keydown(function(e){ var code=e.which; switch (code) { case 38: //上 br ...

  8. 手机root初体验

    看到别人写的一些自己想知道的东西,顿时感到很有兴趣也很强大,固然做一个牛人有很多小粉丝是无比崇高的,可去往牛人的路上也不能少了自己~加油! 一 我来解释一下什么是ROOT以及原理 是不是要ROOT,是 ...

  9. C#委托的简单剖析

    为什么在Button1的Click事件发生之后,button1_Click方法就会被调用呢? 实际上,在我们双击Button1的时候,IDE自动的添加了一段代码,该段代码位于“Form1.Design ...

  10. xmanager 使用

    linux 上安装xterm windows上启动命令: /usr/bin/xterm -ls -display $DISPLAY