十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
在C++中,有关字符串的操作一般会使用头文件
C语言对于字符串的定义有2种方式。
第一种:
#includechar ch[81] = "\0"; //其中的[81]可以写为[]
在第一种定义方式中,可以很明显看出C语言的字符串就是一组字符数据的数组。在此定义方法中,数组元素个数可以规定,也可以省略,但是可能会由于编译器的原因报错(猜测,在GCC和VisualC++中都不会报错)。
第二种:
#includechar ch2[] = {'A','N','D','R','O','I','D','\0'};
在第二种定义方式更强调数组元素。同样,定义字符串时,ch2元素个数可以忽略(在标注元素个数的情况下要注意数组越界),与此同时,末尾的'\0'也可以忽略。
虽然两种定义方法都是以char数组方式定义的,但是在数组元素上会有不同。
如图,第一种定义的字符串"steve jobs"总共10个字符,但是Visual Studiio中显示的是ch[11]。
而第二种定义的字符串总共7个字符,Visual Studio中显示的是ch[7]。我猜测原因是编译器把ch[7]认为是数组,而不是字符串,所以末尾没有。
C++中定义字符串的方式除了上述两种C风格字符串以外,由于拥有新的数据类型string,直接使用string数据类型是最好的方法(因为使用C风格定义方式会有一定的安全问题)。
#include#includeusing namespace std;
string str = "watch out!";
string字符串明显比char数组更容易理解,也更容易操作。不过实际上仍然是char数组ㄟ( ▔, ▔ )ㄏ
(并且最后还是'\0')
2 字符串的输入与输出 2.1 输入C语言中,字符串的输入方法有3种
第一种:使用scanf函数输入不含空格的字符串
#includechar str1[] = "\0";
scanf("%s", str1);
第二种:使用gets函数输入有空格的字符串
#includechar str2[] = "\0";
gets(str2);
gets函数会在用户输入换行符(也就是'\n')的时候,会结束输入,并且把'\n'改为'\0'。
注意:两个gets不能连用,也不能在scanf后直接使用,否则会报错。
第三种:使用putchar函数输入字符串(比较困难)
#include#define MAX 81
char str3[MAX] = "\0";
for(int i = 0; i< MAX; i++)
{
char temp;
temp = getchar();
if(temp != '\n')
{
str3[i] = temp;
}
else
{
break;
}
}
缺点是需要在定义字符串时确定其大长度。(gets就挺好用的)
C++在使用gets时因为安全原因要改为gets_s 。
其实在C++中使用getline函数无疑是最有效的。
2.2 输出C语言输出字符串可以使用printf函数(%s),也可以使用puts函数。
当然,也可以使用putchar函数输出字符串,只不过一样需要用到for循环。
3 字符串的操作与处理 3.1 三个重要的头文件如果在输入字符串之后要分析字符串,或者对字符串做出改动的话,就需要用到这三个头文件:
string.h,stdlib.h,ctype.h。
3.1.1 string.h这个头文件中有6个较为常用的函数
(摘自RONOOB)
这六个函数其实很好理解,从图中就可以了解函数的用途。
在string.h中还有一些函数
1)strncpy(char* s1, char* s2, int n)指的是把s2中的前n个字符复制粘贴到s1上。
#include#includeint main()
{
char ch1[] = "Visual Studio";
char ch2[] = "\0";
strncpy_s(ch2, ch1, 5);
puts(ch2);
return 0;
}
输出的值是Visua。
2)strncmp(char* s1, char* s2, int n)和strcmp同理,只不过比较前n个字符
3)strtok(char* s, const char* delim)的作用是把一个字符串分成多个字符串。delim指分隔符。
#include#includeint main()
{
char ch1[] = "Visual Studio 2022 Installer";
//get the first string
char* token;
const char delim[2] = " "; //this is space
token = strtok(ch1, delim);
//get the remaining string
while (token != NULL)
{
printf("%s\n", token);
token = strtok(NULL, delim);
}
return 0;
}
(改编自RUNOOB)
可以看到, 空格作为了分隔符,所以输出的结果是:
Visual
Studio
2022
Installer
(后面获取剩余部分我还没有看懂)
3.1.2 stdlib.hstdlib.h是一个非常实用的头文件,其中包含着比如srand,exit函数,不过此处涉及到的函数时头文件中关于字符串的常用的函数。
1)atoi(const char* str)可以把字符串(内容是整数)改变为int类型的变量。
如果数字太大可以用atol函数,这个函数的返回值是long长整型。
2)atof(const char* str)可以把字符串(内容是小数)改变为float浮点数。
3)itoa(int value, char* string, int radix)可以把整型数字变为字符串。
其中value为要变换的整型值,string是接收变换后的数字的字符串变量,radix为进制,如2,8,10,16等。如果radix为8,则会把value先变为八进制数,再变为字符串。
3.1.3 ctype.hctype.h可以帮助我们更好地找出并处理字符串中一些特定的信息。
(摘自RUNNOOB)11个函数的返回值都是int,当条件成立(比如islower中的参数为一个小写字母),则会返回一个非零值(true),如果不成立,则返回0。
#include#includeint main()
{
int i = 'p';
if (islower(i))
{
printf("a lower letter %c.\n",i);
}
else
{
printf("a upper letter %c.\n",i);
}
int j = 'A';
if (islower(j))
{
printf("a lower letter %c.\n",j);
}
else
{
printf("a upper letter %c.\n",j);
}
return 0;
}
输出的结果为:
a lower letter p.
a upper letter A.
除此之外,还有涉及大小写转换的两个函数
可以使用这个函数把一个char数组中的字母全部改为大写,或者全部改为小写,或者只更改特定的字母。
3.2 关于字符串的比较大小我很好奇,为什么字符串要比较大小。
不清楚,不过要比较大小的话一个strcmp完事。
关于字符串的比较方式,strcmp会逐个字母比较其ASCII值大小,除非遇到了可以比较出大小的情况(比如遇到了不同的字母,或者是遇到了'\0'。
#include#includevoid compare(char* str01, char* str02)
{
int result = strcmp(str01, str02);
if (result >0) {
printf("%s is larger than %s.\n", str01, str02);
}
else if (result == 0) {
printf("%s is equal to %s.\n", str01, str02);
}
else {
printf("%s is smaller than %s.\n", str01, str02);
}
}
int main()
{
char str1[] = "A";
char str2[] = "At";
char str3[] = "at";
char str4[] = "atmosphere";
char str5[] = "application";
char str6[] = "A";
compare(str1, str6);
compare(str1, str2);
compare(str2, str3);
compare(str4, str5);
return 0;
}
输出结果为:
A is equal to A.
A is smaller than At.
At is smaller than at.
atmosphere is larger than application.
关于常用函数记忆怎么说,我发现从讲开字符串时,讲函数用法的部分越来越多了,并且有些函数(比如strcpy,strcmp,strncpy这些)比较容易混淆。
我决定不采用拼写字母的方式记忆这些函数。不把strcpy念成"S T R C P Y"而是"string copy",strncmp是"string n compare",以及头文件
如有错误请指出,谢谢。
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧