字符串输入的陷阱

来源:互联网 发布:mysql 指定账户已存在 编辑:程序博客网 时间:2024/04/30 14:54

相关讲解详见《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获取字符数组的首地址,可以存储输入的字符串。

原创粉丝点击