字符串
字符串的本质是字符数组
char ch[]={ };
char ch[]=" ";
字符串以\0作为结束的标志,这样以后可以用\0当作一个判断条件,没有写\0系统会自动补一个\0
sizeof是求空间大小,也包括结束标志
strlen计算字符串的实际长度,不包括结束标志\0
字符串的输入输出又三种办法,两两对应,不过也能混着用
#include<stdio.h>
#include<string.h>
int main()
{
char ch[30] = {'\0'};
//从键盘输入字符串的方法
//1.
for(int i = 0; i < 10; i++)
{
scanf("%c", &ch[i]);
}
//2.
scanf("%s", ch);
//3.
gets(ch);
//从键盘输出字符串的方法
//1.
for(int i = 0; i < strlen(ch); i++)
{
printf("%c", ch[i]);
}
//2.
printf("%s", ch);
//3.
puts(ch);
}
当要修改字符串内容的时候
不能用指针,需要用到strcpy函数
#include<stdio.h>
int main()
{
char ch[100] = "我要把他mua醒!";
char *pch = ch;
// gets(ch);
puts(pch);
pch = "他为什么要去塔里啊!下路叫我去我怎么去啊!";
// printf("%s", pch);
//要修改字符数组中的内容,用strcpy函数
strcpy(ch, "他为什么要去塔里啊!下路叫我去我怎么去啊!");
puts(pch);//指针不能修改字符数组中的内容
puts(ch);
return 0;
}
一个字符有多种输入方法
带回显功能:getchar(), getche(),第二种虽然带回显但是不会等你按回车换行就直接输入了
不带回显功能:getch(),一按就输出结果
fgets(保存位置,长度,文件描述符)
文件描述符:stdin标准输入,stdout标准输出,stderr标准出错
#include<stdio.h>
int main()
{
char ch[10];
char ch1;
//带回显功能
// ch = getchar();
// ch = getche();//带回显但是不等按回车
//不带回显功能;
// ch = getch();
// fgets(ch, 10, stdin);//stdin是标准输入,stdout是标准输出, strerr标准出错
//
// printf("%s\n", ch);
// scanf("%s", ch);//它会把空格 回车 teb当作结束符
// printf("%s\n", ch);
gets(ch);
ch1 = getchar();
printf("%s\n", ch);
printf("%c\n", ch1);
return 0;
}
我们也可以做一个输入函数
当没有按回车的时候,将输入的字符存入字符数组,当计数到达n-1的时候(\0是n)跳出while循环,最后输出这个字符串
void fgets_s(char *pstr, int n)
{
int count = 0;
char ch;
while((ch = getchar()) != '\n')
{
*pstr = ch;
pstr++;
count++;
if(count == n - 1)
{
break;
}
}
*pstr = '\0';
}
<ctype.h>:
isdigit 是不是数字
isalpha 是不是字母
isalnum 是不是数字或字母
isxdigit 是不是16进制数
islower 是不是小写字母
isupper 是不是大写字母
tolower 转换为小写字母
toupper 转换为大写字母
isspace 是不是空白字符
iscntrl 是不是控制字符
ispunct 是不是一个标点符号
isprint 是不是可以显示到屏幕上的字符包含空格
isgraph 是不是可以显示到屏幕上的字符?不包含空格
<string.h>
复制函数
strcpy(目的地址,原地址)只复制字符串,但不限制数量,很容易溢出,不会检查是否越界
strncry(目的地址,原地址,长度(不能超过目的地址))函数用于将指定长度的字符串进行复制
两个函数都不会检查越界,很容易溢出
今天做了个用两个指针逆序输出字符串的练习
#include<stdio.h>
#include<string.h>
void turnStr(char *p, int length);
int main()
{
char ch[8] = "\0";
gets(ch);
turnStr(ch, 8);
puts(ch);
return 0;
}
void turnStr(char *p, int length)
{
char temp;
int s = strlen(p);
char *pa = &p[0];
char *pb = &p[s - 1];
for(; s >= 0; pa++, pb--, s--)
{
temp = *pa;
*pa = *pb;
*pb = temp;
if(pb <= pa)
{
break;
}
}
}
我的思路是用两个指针分别指向第一个和最后一个,然后开始遍历,让后让两个指针指向的数交换,然后指向开头的指针++,指向结尾的指针--,最后再后面的指针小于等于前面指针的时候跳出循环,最后得到逆序字符串