感谢您的关注和喜欢!
本文默认读者已经有一点C语言基础,循环操作、分支语句、变量定义等简单操作不再赘述。
本章重点介绍如何从键盘输入并复制相应的字符串。 这里主要用到了C的四个基本API——scanf\\\。
扫描
功能:是格式输入函数,即按照用户指定的格式从键盘输入数据到指定的变量中
头文件:#
调用形式:scanf("",);
注意:第二个参数是地址,记得加&来获取地址符号,如果是数组则不需要加&符号,如果是下表的数组则需要加& 获取地址符号
整数[8];
整数;
scanf("%d", #);
scanf(“%d”,); //是一个数组,使用scanf时可以直接输入
scanf(“%d”,&[1]); //这里只想使用第一个字段,所以需要带入下标
例如:
scanf("%d %d",&a,&b);
如果a和b都读取成功,则scanf的返回值为2
如果只有a读取成功,则返回值为1
如果a和b都没有成功读取,则返回值为0
如果遇到错误或遇到文件结尾,则返回值为 EOF。
并且返回值是int类型。
&a、&b、&c中的&是地址运算符,&a指的是a在内存中的地址。 scanf的作用是根据a、b、c的内存地址将输入的数据存储到a、b、c中。 变量a、b、c的地址在编译的连续阶段中分配(存储顺序由编译器决定)。
注意部分:
如果scanf中的%d连续写入如“%d%d%d”,则输入数据时,数据之间不允许有逗号,只能有空格或制表键或回车键——“2 3 4”或“2(按选项卡)3(按选项卡)4(按选项卡)”。 如果是“%d,%d,%d”,则输入数据时需要加“,”,如“2,3,4”。
相关输入格式
变量类型
%d 个整数
%ld 长
%f 浮动
%如果
%c 字符
%s 字符数组
代码示例:
#include#include int main(void) { int a; float b; char c; scanf("%d,%f,%c",&a,&b,&c); printf("a=%d,b=%f,c=%c\n",a,b,c); scanf("%d%f %c",&a,&b,&c); printf("a1=%d,b1=%f,c1=%c\n",a,b,c); return 0; }
输入输出:
1,2.3,d //输入 a=1,b=2.300000,c=d //输出 1 2.4 e //输入 a1=1,b1=2.400000,c1=e //输出
功能:将从src地址开始且包含NULL终止符的字符串赋值给从dest开始的地址空间,并返回dest(复制地址中存储的新值)
头文件:# 和
调用形式:char(char dest,char *src);
注意:src和dest指向的内存区域不能重叠,dest必须有足够的空间容纳src的字符串。
函数原型:
char* strcpy(char* des,const char* source) { char* r=des; assert((des != NULL) && (source != NULL)); while((*r++ = *source++)!='\0'); return des; }
注意:
该函数的参数是一个字符指针,即可以是字符串变量,也可以是字符数组,因为它们的变量名代表的是第一个字符的地址。 默认情况下,字符串具有空终止符,而字符数组则没有。 所以这里需要注意:因为src需要空终止符,所以字符数组的长度必须大于等于src包含空终止符的总长度。
例如,char* src=“abcd”; 字符目标[5]; 其中 dest 的长度至少为 5。
示例代码:
int main() { char dest[30] = {0}; char src[20]={"Hello world!"}; strcpy(dest, src); printf("%s\n", src); return 0; }
输出:
Hello world!
思考:如果这里dest的长度是2,会不会有问题。
答:如果只是在PC上运行代码,可能不会出现错误,但是如果放到真实的程序中运行,就会出现地址异常错误。 因为dest的栈空间只有两个字节,但是“Hello World!” 需要复制的内容远远超过两个字节,剩余的内容将被复制到dest堆栈空间的连续地址中。 如果这些地址被别人占用,就会出现地址异常,甚至程序崩溃的情况。
所以一般对我们来说是不适用的,可以用来复制。 该API具有长度验证,可以减少类似的内存问题
功能:将字符串src中最多n个字符复制到字符数组dest中(遇到NULL时并不停止复制,而是等到n个字符足够才开始复制),并返回指向dest的指针
头文件:# 和
调用形式:char(char dest, char src, n);
注意:如果n > dest ,则dest堆栈空间溢出并发生崩溃异常。 该函数的注意点与此类似,但n的值需要特别注意。
1) src 字符串长度 dest 字符串长度
如果n=dest字符串的长度,则dest字符串中不存在NULL字符,这会导致输出出现乱码。 如果不考虑src字符串的复制完整性,可以将dest的最后一个字符设置为NULL。
因此,一般将n设置为dest的长度(包括null)(除非将多个src复制到dest)。 当2)中n=dest字符串长度时,定义dest为字符数组,因为此时不存在空字符副本。
示例代码:
#include#include int main() { char name[]={"Hello World!"}; char dest[20]={}; strncpy(dest,name,12); printf("%s\n",dest); }
输出:
Hello World!
功能:该函数将n个字符从s2指向的对象复制到s1指向的对象。如果复制发生在两个重叠的对象中,则此行为未定义
头文件:#
调用形式:void(void s1, const void *s2, n);
返回值:s1的值
注:用于复制内存中的数据。 由于字符串以“\0”结尾,因此只能用于数据中包含“\0”的数据。
与 类似,只不过它在终止空字符处停止。 当n>(s1)时,s2的不足空间补“\0”; 当 n