【C语言】辨析scanf()、gets()和getchar()函数的关系以及printf()、puts()和putchar()的异同

目录

一、scanf()函数原型     

二、gets()函数原型

(1)优点

(2)缺点

三、getchar()函数原型

四、printf()函数的原型

五、puts()函数的原型

六、putchar()函数的原型

七、常用格式符

1.常用的格式符

2.常用前缀标识符


一、scanf()函数原型     

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

返回类型 :int,返回读取字节的个数;读取失败时返回EOF。

调用格式:scanf("<格式化字符串>",<地址表>);

/* scanf example */
#include <stdio.h>

int main()

{
    char str[80];

    int i;

    printf("Enter your family name: ");

    scanf("%79s", str);

    printf("Enter your age: ");

    scanf("%d", &i);

    printf("Mr. %s , %d years old.\n", str, i);

    printf("Enter a hexadecimal number: ");

    scanf("%x", &i);

    printf("You have entered %#x (%d).\n", i, i);


    return 0;

}

运行结果:

注意:

1、当scanf语句中格式符有多个时,格式符之间无间隔或者以空格隔开,则输入数据时应以空格隔开;当以逗号隔开时,则输入数据时应以逗号隔开。(当格式符为%c时特殊)

说明:空格也是字符,连续读取时会将a读入赋给c1,空格读入赋给c2,b读入赋给c3,剩余部分不读取。

2、scanf读取字符串内容时,遇空格停止读入。

3、scanf()不会清空缓存区。

二、gets()函数原型

char * gets ( char * str );

调用格式:gets(指针/数组名);

函数功能:gets函数从标准输入中读取一行文本,并存储于作为参数传递给它的数组中。一行文本由一串字符组成,以一个换行符('\n')结尾。在返回之前,gets函数丢弃换行符,取而代之的是以'\0'结尾。

返回值:读取成功,函数返回于参数指针相同的地址;读入过程中遇到EOF或发生错误,函数返回NULL指针。

/* gets example */
#include <stdio.h>

int main()
{
  char string [256];
  printf ("Insert your full address: ");
  gets (string);     // warning: unsafe (see fgets instead)
  printf ("Your address is: %s\n",string);
  return 0;
}

输出结果:

(1)优点:

1.读入字符串比scanf简洁;

2.遇空格不会停止读取;

3.读取后清空缓存区中的\n。

(2)缺点:

没有限制读取的长度。

解决办法:

1.保证变量有足够大的空间,否则无法容纳gets读取的内容,从而导致堆栈溢出。如果溢出,多出来的字符将被写入堆栈之中,这就覆盖了堆栈原先的内容,破坏一个或多个不相关变量的值。

2.使用gets_s函数

gets_s()函数原型:

char* gets_s(char* p,int n);

n通常指数组长度。

三、getchar()函数原型

int getchar ( void );

调用格式:getchar();

返回值类型:int ,即读取字符的ASCII码值。

函数功能:读取标准输入stdin中的一个字符。

 

/* getchar example : typewriter */
#include <stdio.h>

int main ()
{
  int c;//getchar的返回类型是int,要用int类型的变量来存储
  puts ("Enter text. Include a dot ('.') in a sentence to exit:");//以 . 为结束符读取一句话
  do {
    c=getchar();
    putchar (c);
  } while (c != '.');//最后一个打印的字符是 .

  return 0;
}

运行结果

 

 四、printf()函数的原型

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

调用格式:printf("<格式化字符串>",<变量列表>);

返回值类型:int ,即输出字符的个数

函数功能:打印。

 

/* printf example */
#include <stdio.h>

int main()
{
   printf ("Characters: %c %c \n", 'a', 65);
   printf ("Decimals: %d %ld\n", 1977, 650000L);
   printf ("Preceding with blanks: %10d \n", 1977);
   printf ("Preceding with zeros: %010d \n", 1977);
   printf ("Some different radices: %d %x %o %#x %#o \n", 100, 100, 100, 100, 100);
   printf ("floats: %4.2f %+.0e %E \n", 3.1416, 3.1416, 3.1416);
   printf ("Width trick: %*d \n", 5, 10);
   printf ("%s \n", "A string");
   return 0;
}

运行结果

 其中

 

 这句输出语句输出的内容做一个大致的解释:

%4.2f 保留两位小数 输出占4位。实际超过4位 则按照实际输出,于是 3.1416 输出为3.14 两位小数14;

%+.0e 带符号 科学计数法输出。 无小数部分。 于是输出3的科学计数法。 +3e+00

%E和%e类似 默认6位小数

五、puts()函数的原型

int puts ( const char * str );

调用格式:puts(str);

返回值类型:int,如果成功,返回一个非负值;如果不成功,返回-1(EOF)。

函数功能:输出字符串

/* puts example : hello world! */
#include <stdio.h>

int main ()
{
    char string [] = "Hello world!";
    int n = puts (string);
    printf("%d\n",n);

    return 0;
}

 运行结果:

六、putchar()函数的原型

int putchar ( int character );

调用格式:putchar(ch);

返回值类型:int ,返回输出字符串的ASCII码值

函数功能:输出一个字符

/* putchar example: printing the alphabet */
#include <stdio.h>

int main ()
{
    char c;
    for (c = 'A' ; c <= 'Z' ; c++)
        putchar (c);

    return 0;
}

七、常用格式符

1.常用的格式符

%c      一个字符

%s      一个字符串

%d      一个十进制整数

%u     一个无符号十进制整数

%i       十进制、八进制、十六进制整数

%o      八进制整数

%x       十六进制整数

%X     同上

%f      一个浮点数

%F       同上

%p     一个指针

%e     科学计数法(默认六位小数,基底为e)

%E    同上(基底为E)

%g    自动选择%f或者%e,选其表达出来较短者

%G   同上

2.常用前缀标识符

     flags

description

        -

在给定的字段宽度内左对齐;右对齐是默认值(参见宽度子说明符)。

        

        +

强制在结果前加上加号或减号(+或-),即使是正数。默认情况下,只有负数前面有一个负号。

    (space)

如果不写入符号,则在值之前插入一个空格。

                        

        #

与o、x或X一起使用时,说明值分别在0、0x或0X前面,用于不同于0的值。

与a, A, e, E, f, F, g或G一起使用,它强制写入的输出包含一个小数点,即使后面没有其他数字。默认情况下,如果后面没有数字,则不写入小数点。

        0

当指定填充时,将数字左置为0(0)而不是空格(参见宽度子说明符)。

width

description

  (number)

要打印的最小字符数。如果要打印的值比这个数字短,结果将被填充为空白。即使结果更大,该值也不会被截断。

                    

       *

宽度没有在格式字符串中指定,而是作为必须格式化的参数前面的一个额外的整数值参数指定。

.precision

description

.number

For integer specifiers (d, i, o, u, x, X): precision specifies the minimum number of digits to be written. If the value to be written is shorter than this number, the result is padded with leading zeros. The value is not truncated even if the result is longer. A precision of 0 means that no character is written for the value 0.

For a, A, e, E, f and F specifiers: this is the number of digits to be printed after the decimal point (by default, this is 6).

For g and G specifiers: This is the maximum number of significant digits to be printed.

For s: this is the maximum number of characters to be printed. By default all characters are printed until the ending null character is encountered.

If the period is specified without an explicit value for precision, 0 is assumed.

            

     .*

精度不会在格式字符串中指定,而是作为必须格式化的参数前面的一个额外的整数值参数指定。

(理论参考网站http://cpluscplus.com/reference/)

如有错误,欢迎各位指正!!!

  • 16
    点赞
  • 95
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值