c语言字符串都是以“/0”结尾
而这里就有三个概念 EOF /0 -1 /n
首先c语言中所有字符串的结尾标志都是/0 是字符串结尾的标志 它是一种转义符 而EOF是文件流结束标志代表着 文件(file),也可以是标准输入(stdin)的输入结束 而我们都知道大多数程序EOF的传递是靠-1这个返回值控制的 就相当于 #define EOF (-1) (在stdio.h中是这样定义的) 而'\n'表示换行符,通常用作一些读取函数的读取结束标志,比如scanf,getchar(),gets()等,一旦遇到'\n'就结束读取并返回
呢么就涉及到了几个函数
getchar() 它能读取任何 字符(只要是在ACSII上的)如回车(ACSII码值:10)、换行(13)、null(\0)都可以,所以我要做的是判断,而和gets(直至接受到换行符或EOF,换行符不作为读取串的内容,读取的换行符被转换为null值,并由此来结束字符串)和scanf(tab,空格,换行,回车都作为结束符)都不同
scanf()具体的高级用法可以看这篇https://www.cnblogs.com/windpiaoxue/p/9184194.html
这两个函数主要的区别就是getchar()只能获取一个字符但是scnf()能获取字符串 并且可以通过%s %c %d等等 的操作来限制输入形式
gets()
# include <stdio.h>
int main(void)
{
char str[20] = "\0"; //字符数组初始化\0
printf("请输入字符串:");
gets(str);
printf("%s\n", str);
return 0;
}
此外,关于使用 gets() 函数需要注意:使用 gets() 时,系统会将最后“敲”的换行符从缓冲区中取出来,然后丢弃,所以缓冲区中不会遗留换行符。这就意味着,如果前面使用过 gets(),而后面又要从键盘给字符变量赋值的话就不需要吸收回车清空缓冲区了,因为缓冲区的回车已经被 gets() 取出来扔掉了。
在c语言中没有字符串类型 通过字符数组来模拟字符串
字符数组的初始化
1.指定长度
char buf[4] = {'a','b','c','d'};
char buf[100] = {'a'};//剩下的未定义的全部为0
2.不指定长度
char buf[] = {'a'};//需要多少分配多少
要区分一个问题就是字符串的长度要加上/0
#include<stdio.h>
//#include<string.h>
void main()
{
int size = 0;
char buf[] = "abcd";
int len = strlen(buf);
printf("%d\n",len);
size = sizeof(buf);
printf("%d",size);
}
#include<stdio.h>
#include<string.h>
void main()
{
int size = 0;
char buf[128] = "abcd";
int len = strlen(buf);
printf("%d\n",len);
size = sizeof(buf);
printf("%d",size);
}
所以我们可以发现strlen始终是将字符数组当做出去/0的长度输出
但是size是把这个字符数组当做一个数组看待但是数组的值
sizeof(...) strlen(...)的区别
sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组、指针、类型、对象、函数等。
它的功能是:获得保证能容纳实现所建立的最大对象的字节大小。
由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小。实际上,用sizeof来返回类型以及静态分配的对象、结构或数组所占的空间,返回值跟对象、结构、数组所存储的内容没有关系。
具体而言,当参数分别如下时,sizeof返回的值表示的含义如下:
数组——编译时分配的数组空间大小;
指针——存储该指针所用的空间大小(存储该指针的地址的长度,是长整型,应该为4);
类型——该类型所占的空间大小;
对象——对象的实际占用空间大小;
函数——函数的返回类型所占的空间大小。函数的返回类型不能是void。
strlen
strlen(...)是函数,要在运行时才能计算。参数必须是字符型指针(char*)。当数组名作为参数传入时,实际上数组就退化成指针了。
它的功能是:返回字符串的长度。该字符串可能是自己定义的,也可能是内存中随机的,该函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到遇到结束符NULL。返回的长度大小不包括NULL。
从这张图我们就可以看出sizeof是高亮字体 而strlen只是一个函数
字符串在内存分配 堆上栈上 全局区
字符串的copy
#include<stdio.h>
int main()
{
char a[] = "i am student.";
char b[64];
int i = 0;
for(i = 0;*(a + i)!='\0';i++)
{
*(b + i) = *(a + i);
}
//\0未被copy
b[i] = '\0';
printf("a:%s\n",a);
printf("b:%s\n",b);
return 0;
}
假如不加上b[i] = '\0';
利用指针封装函数完成copy
#include<stdio.h>
#include<stdlib.h>
void copy_str(char *from,char *to)
{
for(;*from != '\0';from++,to++ )
{
*to = *from;
}
*to = '\0';
return ;
}
int main()
{
char *from = "abcd";
char buf2[100];
copy_str(from,buf2);
printf("buf2:%s\n",buf2);
system("pause");
return 0;
}