gets,fgets,puts,fputs,scanf,printf的作用,联系和区别

本文介绍了C语言中字符串的输入输出方法,包括gets、fgets、scanf等输入函数的区别及使用场景,以及puts、fputs和printf的输出应用。通过示例对比了不同函数的特点,帮助读者理解如何选择合适的字符串处理方式。
 


 1. 字符串的输入和输出
     char *str ;
     gets(str);  接受一个字符串 
    puts(str);输出一个字符串。

2.如果字符串文字中间没空格或者是间隔的空格符,ANSI C会将其串联起来。

 

 

3.%p 格式产生的是一个地址。如果编译器不支持%p,可以使用%u和%lu代替。

4.   1)  head 是一个 指针,heart是一个数组的首地址。  head =heart ,但是 heart = head 就是错误的。

       2) 字符串和指针

  

#include <stdio.h>

int main(int argc, const char * argv[])
{

   char * mesg = "dont do it ";
    char *copy;
    
    copy = mesg;   //两个指针指向了同一个字符串。
    
    printf("%s",copy);
    
    printf("mesg = %s,&mesg = %p,value = %p \n",mesg,&mesg,mesg);
    
    printf("copy = %s,© = %p,value = %p \n",copy,©,copy); 
    
    printf("Hello, World!\n");
    return 0;
}

结果如下:

dont do it mesg = dont do it ,&mesg = 0x7fff5fbff8e8,value = 0x100000f0e
copy = dont do it ,&copy = 0x7fff5fbff8e0,value = 0x100000f0e


5.字符串输入   scanf(),gets(),fget()

 1) gets()函数  :以回车符作为结束输入的标志。

     char name[10];
    gets(name);  //warning: this program uses gets(), which is unsafe. 这是因为gets()接收的字符串很容易因为字符数组过小而导致数据溢出。
    printf("%s",name) 
2)fgets()函数:fgets(name,10,stdin);是为IO而设计的,在处理键盘输入的时候就不如gets()那么方便。
 
gets 和fgets 有三方面的不同。
  i  .fgets需要第二个参数说明最大读入的字节数。fgets最多可以读取n-1个字符或者读完一个换行符位置。有这两者中最先满足的那个来结束输入。
ii   .fgets读取到换行符,就会把它存到字符串里面,而不是像gets那样丢弃。
iii  .他还需要第三个参数来说明读哪一个文件,从键盘读数据的时候,可以使用stdin(standard input)作为该参数。
char name[10];
char *pt;
   pt = fgets(name, 10, stdin);
    
     printf("%s",name);
    printf("nihao");
nihao
nihao   //接收了那个换行符。
nihao

如果输入的字符串超过了max,则只会输入前10个。
 char name[10];
    char *pt;
    int num = 0;

    while(!feof(pt))
    {
        pt = fgets(name, 10, fp);
        num++;
        printf("%s\n",name);
    }
    printf("%d",num);

 

 

3)scanf()函数   %S来格式化输入。与gets的区别是:scanf是遇到空格结束,而gets是遇到回车符。
 %10s 是scanf遇到第一个空白符或者是到达第十个字节便结束。

第一次输入都是满足5,10 的输入,所以完整输出。
第二次输入是5满足,但是10已经超,于是第二次输出的时候便只能输出10个
第三输入是第一次便溢出,于是便截断了第一个名字,第二个名字便没有输出。
根据所需输入的特点,用gets()从键盘读取文本可能更好,更容易更快。
scanf主要用于以某一种表中形式输入的混合类型数据的读取和转换。
例如:每一行输入都是包括一种工具的名称,库存数量和单价,用scanf。
如果希望每次只输入一个单词,最好使用scanf。

6.字符串输出   puts,fputs和printf。

1)puts()函数:只需要给出字符串参数的地址。

每一行字符串都单独显示。与printf()不同,puts显示字符串的时候自动在其后添加一个换行符。

  puts(&str1[5])从str1的第六个字符开始输出。
puts(str2 + 4)
puts()的停止标志:遇到空字符就会停下来。

char dont1[] = {'A','o','A','!'};
    
    char side_a[] = "sides A";
    char side_b[] = "side B";
    char dsont1[] = {'W','o','W','!'};
   
    char dont[] = {'W','o','W','!'};
    
    puts(dont);
   运行结果:WoW!WoW!side B


 

      关于堆和栈的问题。

 

2)fputs函数。 是面向文件的输出文本。
     与puts的区别:
  i, fputs需要第二个参数说明需要写得文件,可使用stdout(standrard output)作为参数进行输出显示。
 ii,  fputs 并不为输出添加换行符。
  gets和puts配合使用,fputs和fgets配合使用。


3)printf函数。

7.自动以字符串输入和输出函数。

 puts1.c  //不添加换行。
void puts1(const char* str)
{
    while(*str != '\0')
        putchar(*str++);  //跳转到下一个字符而非改变字符。
}
int main(int argc, const char * argv[])
{
    char *str[10];
    while (gets(str)) {
        puts1(str);
          puts("hello");
    }
warning: this program uses gets(), which is unsafe.
lichan
lichanhello

puts输出:

 char *str[10];
    while (gets(str)) {
        puts(str);
          puts("hello");
    }
warning: this program uses gets(), which is unsafe.
nihao
nihao
hello


 

 

 

 

 

 

 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值