字符数组初始化: 1. 逐个字符初始化,如果不在结尾加\0,用%s输出会乱码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
void test()
{
//初始化方式1
char arr[5] = { 'a','b','c','d','c' };
printf("%s\n", arr);
}
int main()
{
test();
return 0;
}
正确写法:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
void test()
{
//初始化方式1
char arr[5] = { 'a','b','c','d','c' };
printf("%s\n", arr);
for (int i = 0; i < 5; i++)
{
printf("%c ", arr[i]);
}
//正确写法
char arr1[6]= { 'a','b','c','d','c','\0' };
printf("\n%s\n", arr1);
}
int main()
{
test();
return 0;
}
推荐的初始化方式: 下面这种初始化方式,会自动在字符串后面加一个’\0’
char arr[20] = “大忽悠”;
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
void test()
{
//初始化方式2
char arr[20] = "大忽悠";
printf("%s", arr);
}
int main()
{
test();
return 0;
}
求字符串长度的函数strlen和sizeof区别:
scanf输入字符串时遇到空格会结束输入
解决上面问题需要用到: fgetsh或gets_s
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void test()
{
//初始化方式2
char arr[8] ;
//gets函数因为不检测越界情况,一旦越界,就会报错
//所以改用gets_s
//即便写了大小,一旦输入超出,也不会检测,还是会溢出,报错
gets_s(arr, 20);
//或者可以用fgets,不光能向文件输入,也能像终端窗口输入
//当往里面输入数据超出数组大小时,会自动删减,不会产生溢出
//fgets(arr, sizeof(arr), stdin); //stdin标准输入流
printf("%s", arr);
}
int main()
{
test();
return 0;
}
puts或fputs
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
void test()
{
char arr[20]="大忽悠" ;
//需要手动加换行符
printf("%s\n", arr);
//自动换行
puts(arr);
//stdout标准输出设备
//不带换行符
fputs(arr, stdout);
}
int main()
{
test();
return 0;
}
注意: gets函数与scanf函数比较 相同点:
都是从标准输入设备中接收。 接收的字符串结束之后都会自动在字符串的末尾追加’\0’作为字符串结束符。
不同点: gets函数:只把换行符作为结束分隔符,即gets函数可以接收空格(’ ‘)和制表符(’\t’). scanf函数遇到空格,制表符,换行符都会自动结束接收
两者对缓冲区中的回车符不同:
gets函数一遇到回车就结束,并把这个回车从缓冲区中移走 scanf函数在读非空白字符之前会忽略回车,在读取之后如果遇到空白字符会停止输入,并将其留在缓冲区里
如:输入\ndddd\n char sh; sh=(char)malloc(sizeof(char)); //scanf("%s",sh); gets(sh); printf(sh);
scanf函数会忽略第一个换行符,读取后面的字符串,当之后遇到换行符才结束输入 gets函数会在遇到第一个换行符时就结束输入 但是scanf输入结束时第二个换行符被留在缓冲区中 gets输入结束之后换行符也被读走了