Download presentation
Presentation is loading. Please wait.
1
字符串和字符数组 字符串的输入和输出 字符串的基本操作
第七章 字符串 字符串和字符数组 字符串的输入和输出 字符串的基本操作 主讲:李祥 时间:2015年10月
2
7.1 字符串和字符数组 7.2 字符串的输入输出 7.3 操作字符串函数
3
7.1 字符串和字符数组 7.1.1 字符数组 前面第5章中以整型数组为例来讲解数组的相关知识。在C语言中,字符数组也很常用,它由字符类型的元素所组成,其定义方式与整数数组类似,示例代码如下: 上面的示例代码的作用就是定义了一个字符数组,数组名为c,数组包含5个字符类型的元素,该字符数组在内存中的状态如图7-1所示。 图7-1 字符数组c的元素分配情况 char c[5] = {'h', 'e', 'l', 'l', 'o'};
4
7.1 字符串和字符数组 7.1.1 字符数组 字符数组获取元素的方式与整数数组类似,都是通过角标来实现的。为了让读者掌握如何从字符数组中获取元素,接下来通过一个案例来演示,如例7-1所示。 例7-1 1 #include <stdio.h> 2 void main() 3 { 4 char char_array[5] = {'h', 'e', 'l', 'l', 'o'}; // 声明一个字符数组并初始化 5 int i; 6 // 通过sizeof关键字得到数组长度,并遍历打印其内容 7 for (i = 0; i < sizeof(char_array); ++i) 8 { 9 printf("%c", char_array[i]); 10 printf("\n"); 11 } 12 }
5
7.1 字符串和字符数组 7.1.1 字符数组 运行结果如图7-2所示。
图7-2 运行结果 从图7-2中可以看出,字符数组char_array中的元素被依次输出了。由此可见,通过数组角标的方式,可以实现字符数组元素的访问。
6
7.1 字符串和字符数组 7.1.1 字符数组 需要注意的是,当字符数组中的初值个数小于数组长度时,没有赋值的元素会默认赋值为空字符('\0'),具体示例如下: 在上述代码中,定义了一个长度为8的字符数组,当为数组赋5个初值时,字符数组c的元素分配内存情况如图7-3所示。 图7-3 字符数组c的元素分配内存情况 char c[5] = {'h', 'e', 'l', 'l', 'o'};
7
7.1 字符串和字符数组 7.1.2 字符串 为了便于对字符数组进行初始化操作,可以直接使用一个字符串常量来为一个字符数组赋值,具体示例如下: 在上述示例代码中,双引号之间的“hello”是一个字符串常量,字符数组char_array的长度之所以定义6,是因为在字符串的末尾还有一个结束标志‘\0’。它的作用等同于下列代码: 为了帮助大家更好地理解字符串的定义方式,接下来通过一个案例来输出字符串中的字符,如例7-2所示。 char char_array[6] = {"hello"}; char char_array[6] = {'h', 'e', 'l', 'l', 'o', '\0'};
8
7.1 字符串和字符数组 7.1.2 字符串 例7-2 1 #include <stdio.h> 2 void main()
3 { 4 // 声明一个长度为6的字符数组并初始化为hello 5 char char_array[6] = {"hello"}; 6 int i; 7 // 通过sizeof关键字得到数组长度 8 for (i = 0; i < sizeof(char_array); ++i) 9 { 10 // 通过printf输出char_array[]中的字符串 11 printf("char_array 的第 %d 个是 %d\n", i, char_array[i]); 12 } 13 }
9
7.1 字符串和字符数组 7.1.2 字符串 运行结果如图7-4所示。
图7-4 运行结果 在例7-2中,定义了一个字符数组char_array,该字符数组中保存的是字符串“hello”。从图7-4中可以看出,字符数组char_array输出了6个字符,并且最后一个字符是空字符‘\0’。
10
7.1 字符串和字符数组 7.1.2 字符串 除了可以使用sizeof运算符获取字符串长度外,还可以使用strlen()函数来获取,使用strlen()函数得到的是字符串的长度,并不包括末尾的空字符‘\0’,接下来通过一个案例来演示如何获取用户输入字符串的长度,如例7-3所示。 例7-3 1 #include <stdio.h> 2 #include <string.h> 3 void main() 4 { 5 char str[1024]; // 声明一个足够大的字符型数组保存将要被输入的字符串 6 printf("请输入待测量的字符串:"); 7 scanf("%s", str); // 接收用户输入的字符串 8 printf("您输入的字符串长度为 %d。\n", strlen(str)); 9 }
11
7.1 字符串和字符数组 7.1.2 字符串 运行结果如图7-5所示。
图7-5 获取用户输入字符串的长度 从图7-5中可以看出,字符串“I like C programming!”的长度为21。由此可见,使用strlen()函数计算字符串的长度也是很方便的。
12
7.1 字符串和字符数组 7.1.2 字符串 注意: 由数组的定义可知,在定义数组时,数组的大小可以省略,让编译器自动确定长度,因此,下列两种初始化字符串的方式是等同的。 char char_array[6] = {"hello"}; char char_array[] = {"hello"};
13
7.1 字符串和字符数组 7.1.2 字符串 多学一招:字符与字符串的转换
C语言中的字符串实际上是字符数组,而C语言中的字符则是一种基本数据类型。因此在字符和字符串之间进行转换是很容易的。接下来,将char a = 'A'转为字符串,具体步骤如下: (1)创建一个长度为2的字符数组。 (2)将第一个元素设置为对应的字符,第二个元素设置为空字符。 char a_str[2]; a_str[0] = a; a_str[1] = '\0';
14
7.1 字符串和字符数组 7.1.2 字符串 同理,将字符串转为字符也很简单,具体示例如下:
在上述代码中,定义了一个字符数组a_str,该字符数组中保存的是字符串“AB”。只要将字符串中的每个字符赋给字符变量a和b,就可以完成字符串转为字符的操作。 char a_str[] = "AB"; char a = a_str[0]; char b = a_str[1];
15
7.1 字符串和字符数组 7.1.2 字符串 脚下留心:空字符‘\0’的使用
通过前面的讲解不难发现,字符串其实就是一个以空字符‘\0’结尾的字符数组。先来看一个例子,如例7-4所示。 例7-4 1 #include <stdio.h> 2 void main() 3 { 4 char char_array[] = {'h', 'e', 'l', 'l', 'o', '\0', 'W', 'o', 'r', 'l', 'd'}; 5 printf("%s\n", char_array); 6 }
16
7.1 字符串和字符数组 7.1.2 字符串 运行结果如图7-6所示。
图7-6 运行结果 从图7-6中可以看出,字符数组char_array中存储的字符串只输出了一部分。这是因为程序中字符串的结束是通过‘\0’来检测的。在例7-4中,字符数组char_array的第6个字符是‘\0’,程序会认为到了字符串的末尾,从而输出“hello”。
17
7.1 字符串和字符数组 7.1.2 字符串 同样,如果定义一个字符数组时,忘记在字符数组的末尾添加空字符‘\0’,程序也会出现一些奇怪的现象,接下来,通过一个案例来演示,如例7-5所示。 例7-5 1 #include <stdio.h> 2 void main() 3 { 4 char char_array[] = {'h', 'e', 'l', 'l', 'o'}; 5 printf("%s\n", char_array); 6 }
18
7.1 字符串和字符数组 7.1.2 字符串 运行结果如图7-7所示。
图7-7 没有空字符结尾的字符串 从图7-7中可以看出,程序不仅输出了我们想要的“hello”,还输出了一些奇怪的字符。这是因为在使用printf()函数输出字符串时,如果没有遇到空字符,就会继续后面的数据,直到遇到第一个空字符‘\0’。因此,在定义字符数组时,一定不能忘记空字符‘\0’。
19
7.1 字符串和字符数组 7.1.3 字符串与指针 在C语言中,字符型指针用char*来定义,它不仅可以指向一个字符型常量,还可以指向一个字符串。为了描述字符串与指针之间的关系,先来看一段示例代码,具体如下: 上述代码定义了一个字符型指针chr,该指针指向字符串“hello”,字符指针chr和字符串“hello”的关系如图7-8所示。 图7-8 指针chr指向字符串hello char* char_array = "hello"; char* chr = char_array;
20
7.1 字符串和字符数组 7.1.3 字符串与指针 从图7-8中可以看出,字符指针chr既指向了字符‘h’,又指向了字符串“hello”。这是因为字符'h'位于字符串“hello”的起始处,因此,chr也是指向字符‘h’的字符指针。 为了帮助读者更好地理解指针,接下来,通过一个案例来演示如何使用指针修改字符串中的字符,如例7-6所示。
21
7.1 字符串和字符数组 7.1.3 字符串与指针 例7-6 1 #include <stdio.h> 2 int main()
3 { 4 char char_array[] = "hello world!"; 5 char *ptr; 6 printf("修改前的字符串如下:%s \n", char_array); 7 ptr = char_array; // 将一个字符型指针指向字符型数组char_array的首地址 8 // 开始修改字符串 9 while (*ptr != '\0') // 检测是否到串末尾 10 { 11 if (*ptr == ' ') 12 { 13 *ptr = '!'; 14 } 15 ptr++; 16 } 17 printf("修改后的字符串如下:%s \n", char_array); 18 return; 19 }
22
7.1 字符串和字符数组 7.1.3 字符串与指针 运行结果如图7-9所示。
图7-9 运行结果 在例7-6中,由于字符串总是以空字符‘\0’结尾,因此在使用while循环遍历字符串时,只需要判断当前位置的字符是否为空即可。从图7-9中可以看出,使用自增的字符指针可以实现字符串的访问和修改。
23
7.2 字符串的输入输出 7.2.1 gets()函数 gets()函数的用法很简单,它用来读入用户输入的字符串,其语法格式如下:
char* gets(char* str);
24
7.2 字符串的输入输出 7.2.1 gets()函数 当使用gets()函数读入用户输入的字符串时,会把换行符之前所有的字符读取进来(不包括换行符本身),并在字符串的末尾添加一个空字符‘\0’用来标记字符串的结束,读取到的字符串会以指针形式返回。 为了帮助大家更好地理解gets()函数的用法,接下来通过一个具体的案例实现读取用户输入的电话号码,如例7-7所示。
25
7.2 字符串的输入输出 7.2.1 gets()函数 例7-7 1 #include <stdio.h>
2 void main() 3 { 4 char phoneNumber[12]; 5 printf("请输入手机号码:"); 6 gets(phoneNumber); 7 printf("您的手机号码是: %s\n", phoneNumber); 8 }
26
7.2 字符串的输入输出 7.2.1 gets()函数 运行结果如图7-10所示。
从图7-10中可以看出,当用户输入电话号码后,程序会自动在控制台输出号码,这是因为程序的第6行代码使用了gets()函数,该函数可以读取用户输入的手机号码,由此可见使用gets()函数可以实现字符串的输入操作。
27
7.2 字符串的输入输出 7.2.1 gets()函数 注意: 在VS开发工具中,需要在例7-7的代码中加入预处理指令,#pragma warning(disable:4996)消除警告。 使用gets()函数时,用户定义的字符数组的长度必须大于用户输入的字符串长度,否则程序会发生“缓冲区溢出”错误。
28
7.2 字符串的输入输出 7.2.2 puts()函数 puts()函数的用法很简单,它用来输出一整行字符串,其语法格式如下:
从上面的语法格式中可以看出,函数puts()接收的参数是一个字符串指针,该指针指向要输出的字符串,并且会自动在字符串末尾追加换行符‘\n’。如果调用成功后返回一个int类型的正数,否则返回EOF。 为了让大家更深入的理解puts()函数的用法,接下来通过具体的案例来演示,如例7-8所示。 int puts(const char* str);
29
7.2 字符串的输入输出 7.2.2 puts()函数 例7-8 1 #include <stdio.h>
2 void main() 3 { 4 char buf[100]; 5 puts("请输入一个字符串:"); 6 gets(buf); 7 puts("您输入的是:\n"); 8 puts(buf); 9 }
30
7.2 字符串的输入输出 7.2.2 puts()函数 运行结果如图7-11所示。
图7-11 运行结果 从图7-11的运行结果可以看出,在“您输入的是:\n”后面出现了两次换行,这是因为使用puts()函数输出字符串时,会在字符串的末尾追加一个换行符‘\n’,而输出的字符串本身也有一个换行符‘\n’。
31
7.2 字符串的输入输出 7.2.2 puts()函数 多学一招:printf()与puts()的区别。
与puts()函数相比,printf()函数不会一次输出一整行字符串,而是根据格式化字符串输出一个个“单词”。由于进行了额外的数据格式化工作,因此在性能上,printf()比puts()慢。另外printf()还可以直接输出各种不同类型的数据,从这个角度来说,它比puts()使用的更广泛。
32
7.3 操作字符串函数 7.3.1 字符串比较 在程序中,经常需要对字符串进行比较,如判断用户输入的密码是否正确,为此C语言提供了strcmp()函数和strncmp()函数。关于这两个函数的相关讲解,具体如下:
33
7.3 操作字符串函数 7.3.1 字符串比较 1、strcmp()函数
在C语言中,strcmp()函数用于比较两个字符串的内容是否相等,其语法格式如下所示: 在上述语法格式中,参数str1和str2代表要进行比较的两个字符串。如果两个字符串的内容相同,strcmp()返回0,否则返回非零值。 为了帮助大家更好地理解strcmp()函数的用法,接下来通过案例来演示用户名和密码的比较,具体如例7-9所示。 int strcmp(const char* str1, const char* str2);
34
7.3 操作字符串函数 7.3.1 字符串比较 例7-9 1 #include <stdio.h>
2 #include <string.h> 3 void main() 4 { 5 char username[100]; // 定义存放用户名的字符数组 6 char password[100]; // 定义存放密码的字符数组 7 printf("登录\n"); 8 printf("请输入用户名:"); 9 gets(username); // 获取用户输入的用户名 10 printf("请输入密码:"); 11 gets(password); // 获取用户输入的密码 12 // 比较输入的用户名和密码是否正确 13 if (!strcmp(password, "ILoveC") && (!strcmp(username, "user"))) 14 { 15 printf("用户 %s 登录成功!\n", username); 16 } 17 else 18 { 19 printf("登录失败,请检查用户名或密码是否正确输入。\n"); 20 } 21 }
35
7.3 操作字符串函数 7.3.1 字符串比较 运行结果如图7-12所示。
图7-12 运行结果 从图7-12可以看出,在控制台输入的用户名为“user”和密码为“ILoveC”时,输出“用户user登陆成功!”,这是因为在例7-9中的第13行代码使用了strcmp()方法,将用户输入的用户名和密码与指定的字符串进行比较,从而判断用户是否登陆成功。
36
7.3 操作字符串函数 7.3.1 字符串比较 2、strncmp()函数
在C语言中,strncmp()函数可以用来比较两个字符串中前n个字符是否完全一致。具体语法格式如下所示: 在上述语法格式中,参数n表示要比较的字符个数。当然如果字符串str1和str2的长度都小于n,那么就相当于使用strcmp()函数对字符串进行比较。 为了帮助大家更好地理解strncmp()函数的用法,接下来通过一个案例来演示字符串str1和str2前5个字符的比较,如例7-10所示。 int strncmp(const char* str1, const char* str2, size_t n);
37
7.3 操作字符串函数 7.3.1 字符串比较 例7-10 1 #include <string.h>
2 #include <stdio.h> 3 void main() 4 { 5 char* str1 = "abcdef"; 6 char* str2 = "abcdeg"; 7 // 判断字符串str1和str2中的前5个字符是否相同 8 if (!strncmp(str1, str2, 5)) 9 { 10 printf("str1和str2的前5个字符相同"); 11 } 12 else 13 { 14 printf("str1和str2的前5个字符不同"); 15 } 16 }
38
7.3 操作字符串函数 7.3.1 字符串比较 运行结果如图7-13所示。
图7-13 运行结果 在例7-10中定义了两个不同的字符串str1和str2,通过调用strncmp()函数对这两个字符串进行比较,可以发现这两个字符串的前5个字符相同。
39
7.3 操作字符串函数 7.3.1 字符串比较 注意: 函数strcmp()只能接收字符指针作为参数,并不接收单个字符。如果传入的是某个字符(例如‘A’),那么‘A’会被当作指针来使用,从而导致程序报错。
40
7.3 操作字符串函数 7.3.2 字符串查找 1、strchr()函数
在上述语法格式中,参数str为被查找的字符串,c是指定的字符。如果字符串str中包含字符c,strchr()函数将返回一个字符指针,该指针指向字符c第一次出现的位置,否则返回空指针。 为了让读者更好地理解strchr()函数,接下来通过一个案例来实现如何使用strchr()函数统计字符串中某个字符出现的次数,具体如例7-11所示。 char* strchr(const char* str, char c);
41
7.3 操作字符串函数 7.3.2 字符串查找 例7-11 1 #include <stdio.h>
2 #include <string.h> 3 int getcount(char* str, char c) 4 { 5 // 存储找到的字符个数 6 int count = 0; 7 // 存储当前字符指针在字符串中的位置 8 char* ptr = str; 9 // 获取第一次出现字符变量c值的指针位置 10 while ((ptr = strchr(ptr, c)) != NULL) 11 { ptr; count; 14 } 15 return count; 16 } 17 void main() 18 { 19 char str[6] = "abacad"; 20 char c = 'a'; 21 count = getcount(str, c); 22 printf("字符 %c 在字符串中出现了 %d 次。\n", c, count); 23 }
42
7.3 操作字符串函数 7.3.2 字符串查找 运行结果如图7-14所示。
图7-14 统计字符在字符串中的出现次数 在例7-11中,get_count()函数用于实现统计功能,当使用strchr()函数查找指定字符时,根据其返回值是否为NULL判断变量count是否加1。如果查找到指定的字符c,count就加1,并且将字符指针向后移动一位,直到循环结束,输出统计结果。
43
7.3 操作字符串函数 7.3.2 字符串查找 2、strrchr()函数
与strchr()函数相比,strrchr()函数用来查找指定字符在指定的字符串中最后一次出现的位置,其语法格式如下所示: 在上述语法格式中,参数str为被查找的字符串,c是指定的字符。如果字符串str中包含字符c,strchr()函数将返回一个字符指针,该指针指向字符c最后一次出现的位置,否则返回空指针。 由于strrchr()函数的用法与strchr()函数非常相似,这里不再举例说明。 char* strrchr(const char* str, char c);
44
7.3 操作字符串函数 7.3.2 字符串查找 3、strstr()函数
在上述语法格式中,参数haystack是被查找的字符串,needle是子字符串。如果在字符串haystack中找到了字符串needle,则返回子字符串的指针,否则返回空指针。 为了帮助大家更好地理解strstr()函数的用法,接下来通过一个案例来演示如何使用strstr()函数查找一个字符串中的子字符串,具体如例7-12所示。 char *strstr(const char *haystack, const char *needle);
45
7.3 操作字符串函数 7.3.2 字符串查找 例7-12 1 #include <stdio.h>
2 #include <string.h> 3 void main() 4 { 5 char str[10240]; // 声明字符串数组,用于保存段落 6 char word[1024]; // 声明字符串数组,用于保存要查找的字符串 7 char* ptr; 8 printf("请输入要扫描的段落:"); 9 gets(str); 10 printf("请输入要查找的单词:"); 11 gets(word); 12 ptr = strstr(str, word); // 搜索是否包含指定的字符串 13 if (ptr == NULL) 14 { 15 printf("段落中不包含单词 %s。\n", word); 16 } 17 else 18 { 19 // 得到检测出的字符串后20个字符 20 if(strlen(ptr) >= 20) 21 { 22 ptr[20] = 0; 23 } 24 printf("单词出现在 %s 附近。\n", ptr); 25 } 26 }
46
7.3 操作字符串函数 7.3.2 字符串查找 运行结果如图7-15所示。
图7-15 运行结果 从图7-15中可以看出,程序输出了“controls”后的20个字符。由此可见,使用strstr()函数查找字符串中的子字符串是很方便的。
47
7.3 操作字符串函数 7.3.3 字符串连接 1、strcat()函数
strcat()函数的用法很简单,它用来实现字符串的连接,即将一个字符串接到另一个字符串的后面。strcat()函数的语法格式如下所示: 在上述语法格式中,将指针src指向的字符串接到指针dest指向的字符串之后。需要注意的是,在使用strcat()函数之前,dest对应的字符数组必须要有足够的空间来容纳连接之后的字符串,否则会造成缓冲区溢出的问题。 为了读者更好地理解strcat()函数的用法,接下来通过一个案例来实现电话号码和区号连接,具体如例7-13所示。 chat* strcat(char* dest, const char* src);
48
7.3 操作字符串函数 7.3.3 字符串连接 例7-13 1 #include <stdio.h>
2 #include <string.h> 3 void main() 4 { 5 //区号 6 char areaNumber[5]; 7 //电话号码 8 char phoneNumber[12]; 9 int input; 10 //分机号 11 char extraNumber[5]; 12 //用来存储连接后的结果,需要初始化为0! 13 char buffer[25] = {0}; 14 printf("请输入区号:"); 15 gets(areaNumber); 16 printf("请输入电话号码:"); 17 gets(phoneNumber); 18 printf("有分机号吗?(y/n)"); 19 input = getchar(); 20 //由于 getchar() 只读入一个字符,因此需要调用 fflush 来清除输入缓冲区中的换行符 21 fflush(stdin);
49
7.3 操作字符串函数 7.3.3 字符串连接 22 if (input == 'y') 23 {
23 { 24 printf("请输入分机号:"); 25 gets(extraNumber); 26 strcat(buffer, areaNumber); 27 strcat(buffer, "-"); 28 strcat(buffer, phoneNumber); 29 strcat(buffer, "-"); 30 strcat(buffer, extraNumber); 31 } 32 else 33 { 34 strcat(buffer, areaNumber); 35 strcat(buffer, "-"); 36 strcat(buffer, phoneNumber); 37 } 38 printf("您的电话号码是 %s。\n", buffer); 39 }
50
7.3 操作字符串函数 7.3.3 字符串连接 运行结果如图7-16所示。
图7-16 运行结果 例7‑13中实现了连接区号和电话号码的功能。当用户输入区号和电话号码后,程序会通过strcat()函数将区号和电话号码用“—”连接起来。从图7-16中可以看出,程序输出了连接后的电话号码。
51
7.3 操作字符串函数 7.3.3 字符串连接 2、strncat()函数
使用strcat()函数实现字符串连接时,由于strcat()函数存在“缓冲区溢出”的问题,因此,C语言提供的strncat()函数来解决这一问题。strncat()函数的语法格式如下: 在上述语法格式中,除了接收两个字符指针src和dest之外,还接收第三个参数n,该函数用于从src指向的字符数组中当从src指向的字符数组中取不超过n个字符连接到dest指向的字符串。 为了让读者更好地掌握strncat()函数的用法,接下来通过具体的案例来演示,如例7-14所示。 char* strncat(char* dest, const char* src, size_t n);
52
7.3 操作字符串函数 7.3.3 字符串连接 例7-14 1 #include <stdio.h>
2 #include <string.h> 3 void main() 4 { 5 char buf1[30]; // 声明字符串数组,用于保存字符串buf1 6 char buf2[30]; // 声明字符串数组,用于保存字符串buf2 7 printf("请输入第一个字符串:"); 8 gets(buf1); // 接收用户输入的字符串 9 printf("请输入第二个字符串:"); 10 gets(buf2); 11 // 使用strncat()函数来对字符串进行拼接 12 strncat(buf1, buf2, sizeof(buf1) strlen(buf1)); 13 printf("连接后的字符串是 %s。\n", buf1); 14 }
53
7.3 操作字符串函数 7.3.3 字符串连接 运行结果如图7-17所示。
图7-17 运行结果 例7-14中实现了将用户输入的两个字符串进行拼接并输出的功能。在第12行代码中,strncat()函数用于实现字符串的连接,其中,第三个参数通过表达式“sizeof(buf1) strlen(buf1)”是用来计算字符数组buf1最多可容纳多少字符。
54
7.3 操作字符串函数 7.3.4 字符串复制 在程序开发中,有时需要将一个字符串中指定部分字符复制到另一个字符串的指定位置。为此,C语言提供了strcpy()函数,该函数专门用于实现字符串的复制,strcpy()函数的语法格式如下: 在上述语法格式中,参数dest和src可以是字符串中的任意一个位置,字符串指针src所指向的字符串将被复制到dest所指向的字符串中。 char* strcpy(char* dest, const char* src);
55
7.3 操作字符串函数 7.3.4 字符串复制 为了让读者更好地理解strcpy()函数的用法,接下来,使用strcpy()函数将字符串char b[] = "abcde"中的后两个字符复制给char a[10] = "ABCDE"中,实现复制的代码如下: 上述代码执行后,a中字符串变为“de”,其复制流程如图7-18所示。 图7-18 strcpy()的复制流程 strcpy(a, b + 3);
56
7.3 操作字符串函数 7.3.5 数字与字符串的转换 1、atoi()函数
atoi()函数用于将一个数字字符串转换为对应的十进制数,atoi()的语法格式如下所示: 在上述语法格式中,atoi()接收一个数字字符串作为参数,返回转换后的十进制整数。如果转换失败,则返回0。需要注意的是,由于atoi的声明位于stdlib.h文件中,因此需要使用include指令引用头文件stdlib.h。 为了让读者更好地理解atoi()函数的使用,接下来通过一个具体的案例来演示,如例7-15所示。 int atoi(const char* str);
57
7.3 操作字符串函数 7.3.5 数字与字符串的转换 程序输入数字字符串后的运行结果如图7-19所示。 例7-15 图7-19 运行结果
图7-19 运行结果 1 #include <stdio.h> 2 #include <stdlib.h> 3 void main() 4 { 5 char buf[20]; 6 int result; 7 printf("请输入待转换的十进制数:"); 8 gets(buf); 9 result = atoi(buf); 10 printf("转换结果是 %d。\n", result); 11 }
58
7.3 操作字符串函数 7.3.5 数字与字符串的转换 程序输入其他字符串后的运行结果如图7-20所示。
图7-20 运行结果 例7‑15中实现了将用户输入的数字字符串转换成十进制数的功能。当用户输入的是一个表示数字的字符串时,atoi()函数会将字符串转为整数输出,否则转换失败,返回结果0。
59
7.3 操作字符串函数 7.3.5 数字与字符串的转换 2、sprintf()函数
在上述语法格式中,第一个参数表示的是目标字符数组,第二个参数表示格式化字符串,第三个参数表示的是需要转换的整数。 例如,将整数100转换为十进制表示的字符串,代码如下: 从上述代码可以看出,sprintf()与printf()输出函数的使用方法类似,只不过printf()的输出目标是屏幕,而sprintf()将把字符串输出到指定的字符数组中。 int sprintf( char *buffer, const char *format, [ argument] … ); sprintf(str, "%d", 100);
60
7.3 操作字符串函数 7.3.5 数字与字符串的转换 多学一招:使用函数itoa()将整数转换为字符串
VS提供了一个不在C语言标准中的函数itoa(),用来将一个整数转换为不同进制下的字符串,其语法格式如下所示: 在上述语法格式中,第一个参数val表示的是待转换的数,第二个参数表示的是目标字符数组,第三个参数表示的是要转换的进制。 接下来,通过一个案例来演示如何将用户输入的数转换为八进制、十进制和十六进制,如例程7-16所示: char* itoa(int val, char* dst, int radix);
61
7.3 操作字符串函数 7.3.5 数字与字符串的转换 例7-16 1 #include <stdio.h>
2 #include <stdlib.h> 3 void main() 4 { 5 char buf[20]; 6 // 用于保存八进制的转换结果 7 char number_8[20]; 8 // 用于保存十进制的转换结果 9 char number_10[20]; 10 // 用于保存十六进制的转换结果 11 char number_16[20]; 12 int val; 13 printf("请输入待转换的数:"); 14 gets(buf); 15 val = atoi(buf); // 将输入的字符串表示的数字转换为整型 16 // 使用 itoa()函数进行转换 17 itoa(val, number_8, 8); 18 itoa(val, number_10, 10); 19 itoa(val, number_16, 16); 20 printf("八进制下为 %s\n", number_8); 21 printf("十进制下为 %s\n", number_10); 22 printf("十六进制下为 %s\n", number_16); 23 }
62
7.3 操作字符串函数 7.3.5 数字与字符串的转换 运行结果如图7-21所示。
图7-21 使用itoa()将整数转换为字符串 由于itoa()不是C语言标准中规定的函数,因此在某些平台(比如Linux)上是无法使用的,此时只要换用sprintf()即可。
63
本章讲解了C语言中字符串的定义、输入和输出,以及操作字符串的相关函数。字符串在实际开发中广泛应用,通过本章的学习,希望大家能熟练掌握字符串的操作。
Similar presentations