目录
- C语言中没有字符串类型,字符串是存在字符数组中的。
- 字符串一定是字符数组,字符数组不一定是字符串。
- 如果字符数组以'\0'或者数字0结尾,那么这个字符数组就是字符串。
- 注意越界问题
- 加上头文件#include <string.h>
1、字符串的初始化
-
#include<stdio.h> #include<string.h> int main(){ char a1[10] = {'h','e','l','l','o'};//字符数组 char a2[10] = {'h','e','l','l','o','\0'};//字符串 char a3[10] = {'h','e','l','l','o',0};//字符串 char a4[10] = "hello";//字符串,系统自动在字符串结尾分配一个'\0' char a5[] = "hello";//字符串 char a6[] = "\0hello";//字符串 char a7[] = "\012hello";//字符串;\0后面最好不要接数字,避免组成其他转义字符 printf("a1 = %s\n",a1); printf("a2 = %s\n",a2); printf("a3 = %s\n",a3); printf("a4 = %s\n",a4); printf("a5 = %s\n",a5); printf("a6 = %s\n",a6); printf("a7 = %s\n",a7); return 0; }
2、字符数组中scanf的使用
- scanf缺点:不做越界检查。
- scanf在遇到空格和tab时会停止读取,在遇到\n也就是回车时结束输入。
#include<stdio.h> #include<string.h> int main(){ char str[100] = {0}; char tmp[100] = {0}; char a[10]; scanf("%s", str); printf("%s\n", str); scanf("%s",tmp); printf("%s\n",tmp); scanf("%s", a); printf("%s\n",a); return 0; }
-
#include<stdio.h> #include<string.h> int main(){ char str1[10]; char str2[10]; scanf("%s", str1); scanf("%s", str2); printf("%s\n",str1); printf("%s\n", str2); return 0; }
-
3、字符数组中gets的使用(不推荐)
-
#include<stdio.h> #include<string.h> int main(){ char str[10]; gets(str); printf("%s\n",str); return 0; }
-
a. gets允许有空格,不读换行符,不做越界检查,不安全
-
b.gets(str)与scanf(“%s”.str)的区别gets(str)允许输入的字符串含有空格scanf(“%s”.str)不允许含有空格
-
c.由于scanf()和gets()无法知道字符串s大小,必须遇到换行符或读到
文件结尾为止才接收输入,因此容易导致字符数组越界(缓冲区溢出)的情况
4、字符数组中fgets的使用
#include<stdio.h>
#include<string.h>
int main(){
char str[10];
fgets(str,sizeof(str),stdin);
printf("%s\n", str);
return 0;
}
1)一般形式: char *fgets(char *s,int size,FILE*s tream);
2)功能:从stream指定的文件内读入字符,保存到s所指定的内存空间,直到出现换行字符、读到文件结尾或是已读了size -1个字符为止,最后会自动加上字符'\0’作为字符串结束
3)注意事项:
a.如果输入内容>size-1,只取size-1
b.空格,换行符也会读入
c.fgets函数是安全的。
5、字符数组中puts的使用
#include<stdio.h>
#include<string.h>
int main(){
char str[] = "china";
puts(str);
printf("%s",str);
return 0;
}
1)一般形式:int puts(const char *s );
2)功能:标准设备输出s字符串,在输出完成后自动输出一个'\n'。
3)注意事项:
a. puts只是将字符串输出到屏幕显示时自动加换行,但字符串本身并没有变化。
6、字符数组中fputs的使用
#include<stdio.h>
#include<string.h>
int main(){
char str[] = "china";
fputs(str,stdout);
return 0;
}
1)一般形式: int fputs(const char * str,FILE* stream) ;
2)功能:将str所指定的字符串写入到stream指定的文件中,字符串结束符'\0'不写入文件。
3)注意事项:
a.fputs不会自动加换行符
b.如果是固定输出到屏幕,则写为stdout。
7、字符数组中strlen的使用
功能:计算指定字符串str的长度,不包含字符串结束符'\0'
sizeof是测数据类型的长度,不会因为结束符而提前结束。
#include<stdio.h>
#include<string.h>
int main(){
char str1[] = "china";
char str2[] = "\0china";
char str3[10] = "china";
int len1 = strlen(str1);
int len2 = strlen(str2);
int len3 = strlen(str3);
printf("%d,sizeof(str1)=%d\n", len1,sizeof(str1)); //5 6
printf("%d,sizeof(str2)=%d\n", len2,sizeof(str2)); //0 7
printf("%d,sizeof(str3)=%d\n", len3,sizeof(str3)); //5 10
char str4[10];
scanf("%s",str4);
printf("%d\n",strlen(str4)); //读空格前面的
char str5[10];
gets(str5);
printf("%d\n",strlen(str5));//可以读空格,空格这些字符也记作长度
char str6[10];
fgets(str6,sizeof(str6),stdin); //fgets可以读换行符
printf("%d\n",strlen(str6));//加上换行符和空格 ,但不读\0
return 0;
}
8、字符数组中strcpy、strncpy的使用
strcpy:
功能:把src所指向的字符串复制到dest所指向的空间中,'\0'也会拷贝过去。
复制元素:从首元素开始到'\0'结束。
strncpy:
功能:把src所指向的字符串的前n个字符复制到dest所指向的空间中,
是否拷贝结束符看指定的长度是否包含'\0'
#include<stdio.h>
#include<string.h>
int main(){
char src[100] = "hello world";
char dest[100];
char src2[100] = "hello world";
char dest2[100];
strcpy(dest,src);
strcpy(dest2,src2);
printf("%s\n",dest);//hello world
printf("%s\n",dest2);//hello world
return 0;
}
9、字符数组中strcmp、strncmp的使用
strcmp:
功能:比较s1和s2的大小,比较的是字符ASSCII码大小
strncmp:
功能:比较s1和s2前n个字符的大小,比较的是字符ASSCII码大小
俩函数返回值如下:
- 如果返回值小于 0,则表示 str1 小于 str2。
- 如果返回值大于 0,则表示 str1 大于 str2。
- 如果返回值等于 0,则表示 str1 等于 str2。
#include<stdio.h>
#include<string.h>
int main(){
char s1[] = "abc";
char s2[] = "abcd";
int result = strcmp(s1,s2);
printf("%d\n", result);
return 0;
}
10、字符数组中strcat、strncat的使用
strcat:
功能:将src字符串连接到dest的尾部,'\0'也会追加过去。
strncat:
功能:将src字符串前n个字符连接到dest的尾部,'\0'也会追加过去。
#include<stdio.h>
#include<string.h>
int main(){
char src[] = "nihao";
char dest[] = "China";
strncat(dest,src,5);
printf("%s\n",dest); //Chinanihao
return 0;
}
以上就是我对字符串学习的总结。