1.1字符数组与字符串区别
C语言中没有字符串这种数据类型,可以通过char型数组来替代; 注意:
C语言中,字符串一定是一个char型数组,但char型数组未必是字符串;
在C语言的char型数组中,数字0(和字符‘\0’等价)结尾的char数组就是一个字符串,但如果char型数组没有以数字0结尾,那么就不是一个字符串,只是普通字符数组,所以字符串是一种特殊的char的数组。
#include <stdio.h>
int main()
{
char c1[] = { 'c', ' ', 'p', 'r', 'o', 'g' }; //普通字符数组
printf("c1 = %s\n", c1); //注意:可能会出现乱码,因为没有’\0’结束符
//以‘\0’(‘\0’就是数字0)结尾的字符数组是字符串
char c2[] = { 'c', ' ', 'p', 'r', 'o', 'g', '\0' };
printf("c2 = %s\n", c2);
//字符串处理以‘\0’(数字0)作为结束符,后面的'h', 'l', 'l', 'e', 'o'不会输出
char c3[] = { 'c', ' ', 'p', 'r', 'o', 'g', '\0', 'h', 'l', 'l', 'e', 'o', '\0' };
printf("c3 = %s\n", c3);
return 0; }
1.2字符串的初始化:
#include<stdio.h>
int main()
{
//不指定长度,没有0结束符,有多少个元素就有多长
char buf[] = { 'a','b','c' };
printf("buf= %s\n", buf);
//指定长度,后面没有赋值的元素,自动补0
char buf2[100] = { 'a','b','c' };
char buf1[1000] = { "hello" };
printf("buf2=%s\n", buf2);
//所有元素赋值为0
char buf3[100] = { 0 };
//char buf4[2] = { '1','2','3' };//数组越界
char buf5[50] = { '1','a','b','0','7' };
printf("buf5=%s\n", buf5);
char buf6[50] = { '1','a','b',0,'7' };
printf("buf6=%s\n", buf6);
char buf7[50] = { '1','a','b','\0','7' };
printf("buf7=%s\n", buf7);
//使用字符串初始化,编译器自动在后面补0,常用
char buf8[] = "dgasiugduaishg";
//'\0'后面最好不要连着数字,有可能几个数字连起来正好是一个转义字符
//'\ddd'八进制字义字符,'\xdd'十六进制转义字符
//\012相当于\n
char str[] = "\012abc";
printf("str==%s\n", str);
return 0;
}
1.3字符串的输入输出
由于字符串采用了'\0'标志,字符串的输入输出将变得简单方便。
#include<stdio.h>
int main()
{
char str[100];
printf("input string1:\n");
scanf("%s", str);//scanf("%s", str);默认以空格为分隔
printf("output:%s\n", str);
return 0;
}
1.3.1 gets()
功能:从标准输入读入字符,并保存到s指定的内存空间,直到出现换行符或读到文件结尾为止。
返回值(char*):
成功:读入的字符串
失败:NULL
gets(str)与scanf("%s", str)的区别:
gets(str)允许输入的字符串含有空格
scanf("%s", str)不允许含有空格
注意:由于scanf()和gets()无法知道字符串s大小,必须遇到换行符或读到文件结尾为止才接收输入,因此容易导致字符数组越界(缓冲区溢出)的情况,所以我们在定义char型数组时,应该确保其空间足够大。
char str[100];
printf("请输入str: ");
gets(str);
printf("str = %s\n", str);
1.3.2 puts()
功能:标准设备输出字符串,在输出完成后自动输出一个'\n'。
返回值(int):
成功:非负数
失败:-1
int main() {
printf("hello world");
puts("hello world");
return 0;
}
3.4 strlen() (使用时别忘了加头文件 #include<string.h>
功能:计算指定指定字符串s的长度,不包含字符串结束符‘\0’
char str[] = "abc\0defg";
int n = strlen(str);
printf("n = %d\n", n);
3.5 字符串处理相关函数
3.5.1strcpy(a,b)
功能:把b所指向的字符串复制到a所指向的空间中,'\0'也会拷贝过去
成功:返回dest字符串的首地址
失败:NULL
注意:如果参数dest所指的内存空间不够大,可能会造成缓冲溢出的错误情况。
char dest[20] = "123456789";
char src[] = "hello world";
strcpy(dest, src);
printf("%s\n", dest);
3.5.2 strncpy()
strncpy (dest, src, n);
功能:把src指向字符串的前n个字符复制到dest所指向的空间中,是否拷贝结束符看指定的长度是否包含'\0'。
n:指定需要拷贝字符串个数(unsigned int)
成功:返回dest字符串的首地址
失败:NULL
#include<stdio.h>
#include<string.h>
int main()
{
char dest[20];
char src[] = "hello world";
strncpy(dest, src, 5);
printf("%s\n", dest); //最后一位未致0
dest[5] = '\0';
printf("%s\n", dest);
}
3.5.3 strcat()
strcat (dest, src);
功能:将src字符串连接到dest的尾部,‘\0’也会追加过去
成功:返回dest字符串的首地址
失败:NULL
#include<stdio.h>
int main()
{
char str[20] = "123";
char src[] = "hello world";
printf("%s\n", strcat(str, src));
}
3.5.4 strncat()
strncat (dest, src, n);
功能:将src字符串前n个字符连接到dest的尾部,‘\0’也会追加过去
n:指定需要追加字符串个数(unsigned int)
失败:NULL
#include<stdio.h>
int main()
{
char str[20] = "123";
char src[] = "hello world";
printf("%s\n", strncat(str, src, 5));
}
3.5.5 strcmp()
strcmp (s1, s2);
功能:比较 s1 和 s2 的大小,比较的是字符ASCII码大小。
返回值(int):
相等:0
大于:>0 在不同操作系统strcmp结果会不同 返回ASCII差值
小于:<0
#include<stdio.h>
#include<string.h>
int main()
{
char str1[] = "hello world";
char str2[] = "hello mike";
if (strcmp(str1, str2) == 0)
printf("str1==str2\n");
else if
(strcmp(str1, str2) > 0)
printf("str1>str2\n");
else
printf("str1<str2\n");
}
3.5.6 strncmp()
strcmp (s1, s2, n);
功能:比较 s1 和 s2 前n个字符的大小,比较的是字符ASCII码大小。
n:指定比较字符串的数量(unsigned int)
返回值(int):
相等:0
大于:>0
小于:<0
#include<stdio.h>
#include<string.h>
int main()
{
char str1[] = "hello world";
char str2[] = "hello mike";
if (strncmp(str1, str2, 5) == 0)
printf("str1==str2\n");
else if (strcmp(str1, "hello world") > 0)
printf("str1>str2\n");
else
printf("str1<str2\n");
}
3.5.7 strchr()
strchr(s, c);
功能:在字符串s中查找字母c出现的位置
成功:返回第一次出现的c地址
失败:NULL
#include<stdio.h>
#include<string.h>
int main()
{
char src[] = "ddda123abcd";
char* p = strchr(src, 'a');
printf("p = %s\n", p);
}
如图所示,第一个a前面的字符串被省略
3.5.8 strstr()
strstr (haystack, needle);
功能:在字符串haystack中查找字符串needle出现的位置
成功:返回第一次出现的needle地址
失败:NULL
#include<stdio.h>
#include<string.h>
int main()
{
char src[] = "ddddabcd123abcd333abcd";
char* p = strstr(src, "abcd");
printf("p = %s\n", p);
}
3.5.9 atoi()
atoi (nptr);
功能:atoi()会扫描nptr字符串,跳过前面的空格字符,直到遇到数字或正负号才开始做转换,而遇到非数字或字符 串结束符('\0')才结束转换,并将结果返回返回值。
参数:
nptr:待转换的字符串(const char*)
返回值:成功转换后整数(int)
类似的函数有:
l atof():把一个小数形式的字符串转化为一个浮点数。
l atol():将一个字符串转化为long类型
3.6 简单了解C++的string类 (c++基础知识)
C++ 标准库提供了 string 类类型,支持上述所有的操作,另外还增加了其他更多的功能。我们现在简单了解一下 C++ 标准库中的这个类,现在让我们先来看看下面这个实例:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str1 = "Hello";
string str2 = "World";
string str3;
int len;
// 复制 str1 到 str3
str3 = str1;
cout << "str3 : " << str3 << endl; //c++的输出
// 连接 str1 和 str2
str3 = str1 + str2;
cout << "str1 + str2 : " << str3 << endl;
// 连接后,str3 的总长度
len = str3.size();
cout << "str3.size() : " << len << endl;
return 0;
}
现在您可能还无法透彻地理解这个实例,因为到目前为止我们还没有讨论类和对象。所以现在您可以只是粗略地看 下这个实例,等理解了面向对象的概念之后再回头来理解这个实例。