1、字符串和字符数组的区别
- C语言中没有字符串这种数据类型,可以通过char类型的数组来替代
- 字符串一定是一个char的数组,但char的数组未必是字符串
- 数字0(和字符 '\0' 等价)结尾的char数组就是一个字符串,但如果char数组没有以数字0结尾,那就不是一个字符串,只是普通的字符数组
#include <stdio.h>
int main(){
//普通的字符数组
char c1[] = { 'a', 'p', 'p', 'l', 'e'};
printf("c1= %s\n",c1);//乱码,因为没有'\0'结束符
//以'\0'('\0'就是数字0)结尾的字符数组是字符串
char c2[] = { 'a', 'p', 'p', 'l', 'e'};
printf("c2= %s\n",c2);//打印出apple
//字符串的处理以'\0'(数字0)作为结束符,后面的'w','o','r','l','d'不会输出
char c3[] = { 'h', 'e', 'l', 'l', 'o', '\0', 'w', 'o'. 'r', 'l', 'd', '\0'}
printf("c3= %s\n",c3);
return 0;
}
2、字符串的输入输出函数
我们之前学的有scanf();函数,可以通过%s来输入字符串。
#include <stdio.h>
int main(){
char str[100];
printf("input string1: \n");
scanf("%s",str);//默认以空格分隔
printf("output: %s\n",str);
return 0;
}
接下来介绍几个其他的字符串输入输出函数
1)、gets()
函数 | char *gets(char *s) |
头文件 | #include <stdio.h> |
参数 | s:字符串首地址 |
返回值 | 成功:读入的字符串 失败:NULL |
功能 | 从标准输入读入字符,并保存到s指定的内存空间,知道出现换行符或读到文件结尾为止 |
gets(str)和scanf("%s",str)的区别
- gets(str)允许输入的字符串有空格
- scanf("%s",str)不允许含有空格,接收到空格代表停止接收
注意:由于scanf()和gets()无法知道字符串s大小,必须遇到换行符或读到文件结尾为止才接收输入,所以容易导致字符数组越界(缓冲区溢出)的情况。
#include <stdio.h>
int main(){
char str[100];
printf("请输入str: ");
gets(str);
printf("str= %s\n",str);
return 0;
}
2)、fgets()
函数 | char *fgets(char *s, int size, FILE *stream) |
头文件 | #include <stdio.h> |
参数 | s:字符串 size:指定最大读取字符串的长度(size - 1) stream:文件指针,如果读取键盘输入的字符串,固定写stdin |
返回值 | 成功:成功读取的字符串 读到文件尾或出错:NULL |
功能 | 从stream指定的文件内读入字符,保存到 s 所指定的内存空间,直到出现换行字符、读到文件结尾或者是已经读了size - 1个字符为止,最后会加上字符 '\0' 作为字符串结束 |
fgets()在读取一个用户通过键盘输入的字符串的时候,同时把用户输入的回车也作为字符串的一部分。通过scanf()和gets()输入一个字符串的时候,不包含结尾的“\n”,但通过fgets()结尾多了“\n”。
fgets()函数是安全的,不存在缓冲区溢出的问题。
#include <stdio.h>
int main(){
char str[100];
printf("请输入str:");
fgets(str,sizeof(str),stdin);
printf("str=\"%s\"\n",str);
return 0;
}
3)、puts()
函数 | int puts(const char *s); |
头文件 | #include <stdio.h> |
参数 | s:字符串首地址 |
返回值 | 成功:非负数 失败:-1 |
功能 | 标准设备输出s字符串,在输出完成后自动输出一个'\n' |
#include <stdio.h>
int main(){
printf("Hello World");//输出之后不会换行
puts("Hello World");//输出直接自己加一个\n自动换行
return 0;
}
4)、fputs()
函数 | int fputs(const char *str, FILE *stream) |
头文件 | #include <stdio.h> |
参数 | str:字符串 stream:文件指针,如果把字符串输出到屏幕,固定写stdout |
返回值 | 成功:0 失败:-1 |
功能 | 将str所指定的字符串写入到stream指定的文件中,字符串结束符'\0' 不写入文件 |
fputs()是puts()的文件操作版本,但fputs()不会自动输出一个'\n'
#include <stdio.h>
int main(){
printf("Hello World");//输出Hello World,不会自动换行
puts("Hello World");//输出Hello World之后自动换行
fputs("Hello World",stdout);//输出Hello World之后不会自动换行
return 0;
}
3、求字符串长度函数
strlen()
函数 | size_t strlen(const char *s); |
头文件 | #include <string.h> |
参数 | s:字符串首地址 |
返回值 | 字符串 s 的长度,size_t为unsigned int类型 |
功能 | 计算指定字符串s的长度,不包含字符串结束符’\0‘ |
#include <stdio.h>
#include <string.h>
int main(){
char str[] = "abc\0defg";
int n = strlen(str);
printf("n = %d\n",n);//输出3.字符串中有结束标志\0
return 0;
}
4、练习:字符串的追加
#include <stdio.h>
int main(){
char str1[] = "abcdefg";
char str2[] = "123456";
char dest[100];
int i = 0;
while(str1[i] != 0){
dest[i] = str1[i];
i++;
}
int j = 0;
while(str2[j] != 0){
dest[i + j] = str2[j];
j++;
}
dest[i + j] = 0;//添加字符串结束标志
printf("dest = %s\n",dest);
return 0;
}