完美解析C语言函数puts()、free()和gets()

1、 puts

puts() 只用来输出字符串,就算只有一个字母“a” ,也会当成一个字符串。因为字符串的最后一项默认为 “\0” (字符串终止符的标志),而puts()遇到 \0 会输出 \n!!!也就是说,puts(s) 和 printf("%s\n",s) 的输出格式是一样的。printf()的输出格式很多,可以根据不懂得需要加转义字符,达到格式化输出。

puts()的参数可以直接是字符串,如puts(“abcd”); 也可以是变量名, 如 a = “abcd”; puts(a); 有换行

printf()的参数也可以直接是字符串,如printf(“abcd”);要实现换行必须printf("%s\n",a);

用法

int puts(const char *string)

puts()函数包含在头文件<stdio.h>中

实例
1、输出字符串数组

#include <stdio.h>
int main(){
	char str[]="hello world";
	puts(str); 
	return 0;
} 
 

/*output:
hello world
按任意键退出
*/
注意输出的“hello world”后面有一个换行。

2、从指定字符位置开始输出

#include <stdio.h>
int main(){
	char str[]="hello world";
	puts(str+2); 
	return 0;
} 

/*output:
llo world
按任意键退出
*/
说明
1、puts()只能输出字符串,不能输出数值或者进行格式转换,即不能要求输出格式增加空格、换行(指的是输出内容的中间进行换行)等要求;

2、可以将字符串直接写入puts()。如:puts(“hello world”);

3、puts()和 printf的用法一样,puts()函数的作用与语句“printf("%s\n",s);的作用相同。注意:puts在输出字 符串后会自动输出一个回车符。

4、puts()函数的一种实现方案如下:

int puts(const char * string) 
{ 
    const char * t = string; 
    const char * v = string; 
    int i = 0; 
    while(*t!='\0') 
    { 
        i++; 
        t++; 
    } 
    int j = 0; 
    for(j;j<=i;j++) 
        putchar((v[j])); 
    putchar('\n');
    return 0; 
}

2、 free

free函数是我们再写C语言程序时常用的函数,但是使用时需要注意,一不小心很肯能会引起吐核。

注意:free函数与malloc()函数配对使用,释放malloc函数申请的动态内存。对于free§这句语句,如果p 是NULL 指针,那么free 对p 无论操作多少次都不会出问题。如果p 不是NULL 指针,那么free 对p连续操作两次就会导致程序运行错误。

看一个程序

#include <stdio.h>
#include <stdlib.h>
 
int main()
{
  char * name = NULL;
  free(name);
  free(name);
  free(name);
   
  printf("no problem11111111\n");
 
  name = (char *) malloc(10);
  if(name)
  {
    printf("allocate successful\n");
  }
  else
  {
    printf("allocate failed\n");
  }
 
  free(name);
  free(name);
   
  printf("no problem2222222\n");
 
  return 0;
}

这个程序正好验证了上面的注意事项。

为了避免出现这个错误,自己写了一个函数:

void myfree(void ** point)
{
  if(*point != NULL)
  {
    free(*point);
    *point = NULL;
  }
}

这个函数将一级指针的地址作为菜蔬传入,这样就可以对一级指针进行操作。每次用free释放完空间,都将一级指针置为NULL,这样就避免了重复释放时程序崩溃。

将这个函数应用到刚才的程序中就是:

#include <stdio.h>
#include <stdlib.h>
 
 
void myfree(void ** point)
{
  if(*point != NULL)
  {
    free(*point);
    *point = NULL;
  }
}
 
 
int main()
{
  char * name = NULL;
   
  myfree((void**)&name);
  myfree((void**)&name);
  myfree((void**)&name);
   
  printf("no problem11111111\n");
 
  name = (char *) malloc(10);
  if(name)
  {
    printf("allocate successful\n");
    printf("地址为: %p\n",name);
 
  }
  else
  {
    printf("allocate failed\n");
  }
 
  myfree((void**)&name);
  myfree((void**)&name);
   
  printf("no problem2222222\n");
 
  return 0;
}

可以发现程序已经没有错误。

但是还有一个问题需要处理: 每次调用myfree函数的时候都需要取一级指针的地址而且需要强制类型转换成void** ,也就是每次都要写(void**)&point,这样很麻烦。

其实我们可以用带参数的宏定义来简化代码,宏定义如下:

#define FREE(p) myfree((void **)&p)

应用宏定义后的完整代码:

#include <stdio.h>
#include <stdlib.h>
 
 
#define FREE(p) myfree((void **)&p)
 
 
void myfree(void ** point)
{
  if(*point != NULL)
  {
    free(*point);
    *point = NULL;
  }
}
 
 
int main()
{
  char * name = NULL;
   
  FREE(name);
  FREE(name);
  FREE(name);
   
  printf("no problem11111111\n");
 
  name = (char *) malloc(10);
  if(name)
  {
    printf("allocate successful\n");
    printf("地址为: %p\n",name);
 
  }
  else
  {
    printf("allocate failed\n");
  }
 
  FREE(name);
  FREE(name);
   
  printf("no problem2222222\n");
 
  return 0;
}
#include <stdio.h>
#include <stdlib.h>


#define FREE(p) myfree((void **)&p)


void myfree(void ** point)
{
  if(*point != NULL)
  {
    free(*point);
    *point = NULL;
  }
}


int main()
{
  char * name = NULL;
  
  FREE(name);
  FREE(name);
  FREE(name);
  
  printf("no problem11111111\n");

  name = (char *) malloc(10);
  if(name)
  {
    printf("allocate successful\n");
    printf("地址为: %p\n",name);

  }
  else
  {
    printf("allocate failed\n");
  }

  FREE(name);
  FREE(name);
  
  printf("no problem2222222\n");

  return 0;
}
 

引用文献

3、gets

*gets(char s) 函数从 stdin 读取一行到 s 所指向的缓冲区,直到一个 终止符或 EOF。
int puts(const char s) 函数把字符串 s 和一个尾随的换行符写入到 stdout。
编写练习:

#include<stdio.h>
int main()
{
	char str[100];
	printf("Please enter a value:");
	gets(str);
	printf("\nYou entered:");
	puts(str);
	printf("\n");
	return 0;
}

char str [100];// 定义一个字符数组,相当于字符串变量

  • 8
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

源代码杀手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值