小学生都看得懂的C语言入门(6): 字符串
1.字符用 char 表示
#include<stdio.h>
int main()
{
char c;
char d;
c=;
d='';
if (c==d){
printf("equal\n");
}else{
printf("not equal\n");
}
return ;
}
结果显示两者不相等, 若用%d形式输出,则有
printf("c=%d\n",c);//
printf("d=%d\n",d);//49
如何输入'1' 给字符c ?
#include<stdio.h>
int main()
{
char c;
scanf("%c",&c);// 输入1
printf("c=%d\n",c);//'1'表示ASCII码
printf("c='%c'\n",c);//'1' 这里的'' 要自己加上去!!
return ;
}
输入一个1进去,
#include<stdio.h>
int main()
{
char c;
int i;
scanf("%d",&i);
c=i;
printf("c=%d\n",c);//
printf("c='%c'\n",c);//
return ;
}
分别输入1 和 49 得到:
由此,'1' 的ASCII编码是49
#include<stdio.h>
int main()
{
char c;
int i;
scanf("%d",&i);
c=i;
printf("c=%d\n",c);//
printf("c='%c'\n",c);//
if (==''){
printf("okay");
}
return ;
}
输入48 ,得到 ,
说明 '1'=49, '0'=48;
#include<stdio.h>
int main()
{
char c;
scanf("%c",&c);
printf("c=%d\n",c);//
printf("c=%c\n",c);//49
return ;
}
得到
2. 混合输入
#include<stdio.h>
int main()
{
// 混合输入
int i;
char c;
scanf("%d %c",&i,&c);
printf("i=%,c=%d,c='%c'",i,c,c);
return ;
}
输入 12 1
得到 i=12,c=49,c='1'
输入 12 a
得到 i=12,c=97,c='a'
字符的计算 如下
#include<stdio.h>
int main()
{
char c='A';
c++;
printf ("'%c'\n",c);//'B'
int i='Z'-'A';
printf ("%d\n",i);// return ;
}
#include<stdio.h>
int main()
{
printf("123\bA\n456"); // \b 往回删一个3,
return ;
}
12A
456
3. 字符串
char w[]={'g','o','o','d','!'}; // 字符数组
char w[]={'g','o','o','d','!','\0'}; // 后面加了0, 表示字符串
字符串是以0 结尾的字符, 0 与'\0' 一样, 但是与'0'不同.
但是计算字符串的长度是不包含这个 0 的;
字符串以数组的形式存在, 可以用数组或者指针进行访问,
string.h 中很多处理字符串的函数;
#include<stdio.h>
int main()
{
// 定义字符串
char *str="hello"; // 要用双引号
char w[]="hello";
char line[]="hello"; // 实际长度是5+1, 结尾还有表示结束的0;
printf("please in put a num"" for example 1:"); // 会自动连起来
printf("please in put a num"
" for example 1:");// 与上述一样
return ;
}
#include<stdio.h>
int main()
{
int i=;
char *s="hello world";
char *s2="hello world";
printf("&i=%p\n",&i); // 打印i 的地址
printf("s=%p\n",s);
printf("s2=%p\n",s2);
return ;
}
得到结果
&i=000000000062FE3C
s=0000000000404000
s2=0000000000404000
s s2的地址一样, 但是本地变量i 和s 相差很大, s地址很小, i 地址很大, 他们距离很远, 这是为啥??
#include<stdio.h>
int main()
{
char *s="hello world";
s[]='B';// 出错
printf("here s[0]=%c\n",s[]); // 错了 return ;
}
s 位于程序的代码端, 是只读的 ,不可以写, 因此不能进行修改s[0]='B', 否则程序崩溃!!
实际上 这个s 的类型是 const char *s, 由于历史原因, 编译器不接受 const 写法;
如果想要对 字符串进行修改, 就要用数组形式进行定义!! char s[ ]="hello world!";
#include<stdio.h>
int main()
{
int i=;
char *s="hello world";
// s[0]='B';
char *s2="hello world";
char s3[] ="hello world";
printf("&i=%p\n",&i); // 打印i 的地址
printf("s=%p\n",s);
printf("s2=%p\n",s2);
printf("s3=%p\n",s3);
// printf("here s[0]=%c\n",s[0]); // 错了 return ;
}
得到
&i=000000000062FE3C
s=0000000000404000
s2=0000000000404000
s3=000000000062FE30
s3 的地址也在一个很大的地方!!, 是本地变量
4.字符串运算
char*t="title"; // t指向了字符串
char*s;
s=t; //s也指向了该字符串
// 并没有产生新的字符串,只是让指针s 指向了 t所指的字符串,
// 对s 的操作就是对t做的
#include<stdio.h>
int main()
{
char ss[];
scanf("%s",ss) ; //读入一个单词, 到空格,tab 或者回车为止
printf("%s#\n",ss);
return ;
}
输入hello world
得到hello#
没有读到 world, 如何让它读到??
#include<stdio.h>
int main()
{
char ss[];
char ss1[];
scanf("%s",ss) ; //读入一个单词, 到空格,tab 或者回车为止
scanf("%s",ss1);
printf("%s#\n%s#\n",ss,ss1);
return ;
}
输入hello world
得到
hello#
world#
但是没有读到hello 与 world 中间的空格, 这个空格用来区分两个单词, 是个分隔符
scanf 读到空格,tab 或者回车为止, 并且他是不安全的, 因为不知道要读入的长度, 怎么处理?
scanf("%7s",ss); // 最多输入7个字符! 数组长度是8 ,算上结尾的0 ,最多7个
#include<stdio.h>
int main()
{
char ss[];
char ss1[];
scanf("%7s",ss) ; //读入一个单词, 到空格,tab 或者回车为止
scanf("%7s",ss1);
printf("%s#\n%s#\n",ss,ss1);
return ;
}
注意: 第一个超过7个的只读了前7个, 后面断掉了, 但是第二个单词还是取了前面没读完的部分,
输入fahfjkhdskjfh jadshfjka
fahfjkh#
dskjfh#
输入hjd jfahkjhfl
hjd#
jfahkjh#
其他:
char b[]="";// 空字符串, b[0]='\0'
char b[]=""; // 这个数组长度只有1,
5. 字符串的函数
#include<string.h>
常用函数:
(1)strlen 计算长度
(2)strcmp 比较
#include<stdio.h>
#include<string.h>
int main()
{
char line[]="hello";
printf("srtlen=%lu\n",strlen(line));// 5 字符串长度
printf("sizeof=%lu\n",sizeof(line)); //6 占据的空间
return ;
}
#include<stdio.h>
#include<string.h>
int main()
{
char s1[]="hello";
char s2[]="hello";
printf("%d\n",strcmp(s1,s2));//0 表示两者相等 ,这个有些与逻辑值不同
printf("%d\n",s1==s2);//0 ,地址不相同
return ;
}
strcmp(s1,s2) 得到
0 s1==s2;
1 s1<s2;
-1 s1>s2;
#include<stdio.h>
#include<string.h>
int main()
{
char s1[]="hello";
char s2[]="gello";
printf("%d\n",strcmp(s1,s2));//1
return ;
}
(3) strcpy 复制 位置对应, 从位置0开始,
(4)strcat 连接, 位置不对应, 从后面开始接上去!
两者都存在安全问题, 可能目标地的存储空间不够, 用strncpy, strncat, n 表示最多拷贝多少个进去
strncpy(s1,s2,n)
(5)strchr 在字符串中找字符, null 则没有找到
小学生都看得懂的C语言入门(6): 字符串的更多相关文章
- 小学生都看得懂的C语言入门(1): 基础/判别/循环
c基础入门, 小学生也可以都看得懂!!!! 安装一个编译器, 这方面我不太懂, 安装了DEV-C++ ,体积不大,30M左右吧, 感觉挺好用,初学者够了. 介绍下DEV 的快键键: 恢复 Ctrl+ ...
- 小学生都看得懂的C语言入门(5): 指针
现在已经学到C语言的后面了, 快学完咯.... (一)取地址运算 先来看一下sizeof 计算所占字节 #include<stdio.h> int main() { int a; a=; ...
- 小学生都看得懂的C语言入门(4): 数组与函数
// 之前判断素数, 只需要到sqrt(x)即可,//更加简单的, 判断能够比已知的小于x的素数整除, 运行更快 #include <stdio.h> // 之前判断素数, 只需要到sqr ...
- 小学生都看得懂的C语言入门(3): 数组与函数
#include <stdio.h> int main() { int x; ; ; scanf("%d",&x){ sum+=x; cnt++; scanf( ...
- 小学生都看得懂的C语言入门(2): 判别 循环的一些应用实例
1.bool 类型 定义bool类型之前需要导入#include <stdbool.h> #include <stdio.h> #include <stdbool.h&g ...
- 小学生都能读懂的网络协议之:WebSocket
目录 简介 webSocket vs HTTP HTTP upgrade header websocket的优点 webScoket的应用 websocket的握手流程 WebSocket API 总 ...
- 胖虎都看得懂的CSS入门
CSS入门 CSS是什么 摘自维基百科 层叠样式表(英语:Cascading Style Sheets,简写CSS),又称串样式列表.级联样式表.串接样式表.层叠样式表.階層式樣式表,一种用来为结构化 ...
- 小白都看得懂的Javadoc上手教程
Javadoc是什么 官方回答: Javadoc is a tool for generating API documentation in HTML format from doc comments ...
- 小白都看得懂的Javadoc使用教程
Javadoc是什么 官方回答: Javadoc is a tool for generating API documentation in HTML format from doc comments ...
随机推荐
- 【blog】Hibernate5如何设置SQLite的方言(待更新...)
参考链接 Hibernate3.Hibernate4.Hibernate5 hibernate5连接sqlite (目前参考的是这个方法)
- Maven入门项目创建
项目构建 1.新建maven项目 2.跳过骨架选择,如果不跳过骨架选择创建出的项目目录是不全的(骨架其实就是项目的模板) 3.Group Id,Artifact Id,Version称为项目的坐标,当 ...
- [转载]Meta Learning单排小教学
原文链接:Meta Learning单排小教学 虽然Meta Learning现在已经非常火了,但是还有很多小伙伴对于Meta Learning不是特别理解.考虑到我的这个AI游乐场将充斥着Meta ...
- 20165221 JAVA第五周学习心得
课本知识点 内部类与异常类 内部类:在一个类中定义另一个类 特点:外嵌类的成员在内部类仍然有效,内部类也可调用外嵌类的方法,内部类的类体不能声明类变量及类方法 非内部类不能是static类 匿名类:创 ...
- Linux三剑客之awk命令
awk简介 awk其名称得自于它的创始人 Alfred Aho .Peter Weinberger 和 Brian Kernighan 姓氏的首个字母.实际上 AWK 的确拥有自己的语言: AWK 程 ...
- SpringBoot的Session并发控制
⒈是什么? 即控制业务系统中一个用户只能有一个Session ⒉解决方案 1.当这个用户在其它地方登录的时候,把之前的Session失效掉. package cn.coreqi.security.co ...
- Delphi XE-Windows下配置开发环境 (Android版/IOS)
Delphi XE-Windows下配置开发环境 (Android版/IOS) http://www.52jike.com/thread-1-1-1.html Delphi XE5的Androi ...
- 使用sudo而无需输入密码的设置
在linux上,root用户是老大,什么事都能做.但是,很多时候由于安全等各种原因,我们不希望把root用户开放给大家,但是又希望其他的用户可以有root的权限,所以就有了sudo用户.而执行sudo ...
- JUnit3 和 JUnit4的区别
JUnit3 和 JUnit4的区别 1.JUnit 4使用org.junit.*包而JUnit 3.8使用的是junit.Framework.*;为了向后兼容,JUnit4发行版中加入了这两种包. ...
- 在TOMCAT下配置工程的默认访问设置(转)
对工程的部署一般是将工程的压缩文件放在tomcat安装目录的webapps下,访问时通过键入:http://localhost:8080/xx(假定为本机访问,xx是部署时的应用工程的访问名字). 而 ...