字符串输入的陷阱

相关讲解详见《C语言程序设计实用教程(Applied C: An Introduction and More)》,[美]Alice E. Fischer, David W. Eggert等著,裘岚、张晓芸等译,电子工业出版社,2001年9月第1版,第362页至363页。

先看第一个程序:

#include "stdio.h"

typedef char* string;

void main()

{

string sz = "Hi, Unice!";

printf("Input:/n");

scanf("%s", sz);//这样做有风险,尝试修改字符串"Hi, Unice!"中的字符值!!!

//不能在指针中存储输入字符串!!!

printf("%s/n", sz);

}

该程序尝试用指针存储输入字符串,试图改变已有字符串"Hi, Unice!"中的字符值,会发生错误!如果字符指针sz没有被初始化,那么输入语句scanf("%s", sz)则试图改变未知地址的存储值,相当危险!

可用如下程序进行改进:

#include "stdio.h"

typedef char* string;

void main()

{

char ca[100];

printf("Input:/n");

scanf("%s", ca);

printf("%s/n", ca);

}

该程序用数组存储输入字符串,数组已分配内存空间,并可以向其中赋值。

也可以按如下程序改进:

#include "stdio.h"

typedef char* string;

void main()

{

char ca[100];

string sz = ca;

printf("Input:/n");

scanf("%s", sz);

printf("%s/n", sz);

}

该程序中,字符指针sz获取字符数组的首地址,可以存储输入的字符串。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值