确保往明确分配的可写空间写入

 

 

8 .1 为什么这段代码不行?

char *answer;                  <----未明确分配空间
printf("Type something:/n");
gets(answer);
printf("You typed /"%s/"/n", answer);

指针变量 answer, 传入 gets(), 意在指向保存得到的应答的位置, 但却没有指向任何合法的位置。换言之, 我们不知道指针 answer 指向何处。因为局部变量没有初始化, 通常包含垃圾信息, 所以甚至都不能保证 answer  是一个合法的指针。改正提问程序的最简单方案是使用局部数组, 而不是指针, 让编译器考虑分配的问题:

    #include <stdio.h>
    #include <string.h>
char answer[100], *p;
printf("Type something:/n");
fgets(answer, sizeof answer, stdin);
if((p = strchr(answer, '/n')) != NULL)
*p = '/0';
printf("You typed /"%s/"/n", answer);

本例中同时用 fgets() 代替 gets(), 以便 array 的结束符不被改写。不幸的是, 本例中的 fgets() 不会象 gets()  那样
自动地去掉结尾的 /n。 也可以用 malloc() 分配  answer 缓冲区。

另:少使用strcat,尽量用strncat

 

 char *s1 = "Hello, ";
char *s2 = "world!";
char *s3 = strcat(s1, s2); 
 

 跟前面的问题一样, 这里主要的问题是没有正确地为连接结果分配空间。C 没有提供自动管理的字符串类型。
C 编译器只为源码中明确提到的对象分配空间 (对于字符串, 这包括字符数组和串常量)。程序员必须为字符串连
接这样的运行期操作的结果分配足够的空间, 通常可以通过声明数组或调用 malloc() 完成。

strcat() 不进行任何分配; 第二个串原样不动地附加在第一个之后。因此, 一种解决办法是把第一个串声明为数组: 

    char s1[20] = "Hello, ";

由于 strcat() 返回第一个参数的值, 本例中为 s1, s3 实际上是多余的; 在 strcat() 调用之后, s1 包含结果。

strcat() 调用实际上有两个问题:
1.s1 指向的字符串常数, 空间不足以放入连接的字符串

2. 不一定可写。

 对于:
  char *p;
  strcpy(p, "abc");
 未初始化的指针 p 所指向的随机地址,这样做很可能导致灾难。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值