还是要继续学习,每天给自己打气。

字符数组

char word[] = {'H','e','l','l','o'};

这不是c语言的字符串,不能用字符串的方式做计算

一、字符串

char word[] = {'H','e','l','l','o','\0'};

区别就是最后多了一个0,这就成为了字符串

  1. 以0(整数0)结尾的一串字符
  2. 0或'\0'是一样的,但和'0'不同
  3. 0标志字符串的结束,但它不是字符串的一部分
  4. 计算字符串长度的时候不包含这个0
  5. 字符串以数组的形式存在,以数组或者指针的形式访问,更多的是以指针的形式
  6. string.h里有很多处理字符串的函数

字符串变量

char *str = "hello";
char word[] = "hello";
char line[10] = "hello";

字符串常量

  1. “hello”
  2. “hello"会被编译器变成一个字符数组放在某处,这个数组的长度是6,结尾还有表示结束的0
  3. 两个相邻的字符串常量会被自动连接起来

字符串

  1. c语言的字符串是以字符数组的形态存在的
  2. 不能用运算符对字符串做运算
  3. 通过数组的方式可以遍历字符串
  4. 唯一特殊的地方是字符串字面量可以用来初始化字符数组

二、字符串常量

char *s = "hello world";
  1. s是一个指针,初始化为指向一个字符串常量
  2. 由于这个常量所在的地方,所有实际上s是const char* s ,但是由于历史的原因,编译器接受不带const的写法
  3. 但试图对s所指的字符串做写入会导致严重的后果
  4. 如果需要修改字符串,应该用数组
char s[] = "hello , world!";

指针还是数组

char *str = "hello";
char word[] = "hello";

数组:可以读,可以写

指针:只能读,不能修改

如果要构造一个字符串 ------>数组

如果要处理一个字符串 ------>指针

char*是字符串

  1. 字符串可以表达为char*的形式
  2. char*不一定是字符串
  3. 本意是指向字符串的指针,可能指向的是字符的数组
  4. 只有它所指的字符数组的结尾有0,才能说它所指的是字符串
#include <stdio.h>

int main(void)
{
char *s = "hello world";
char *s1 = "hello world";
char s3[] = "hello world"; // 这个是不能修改的
// s[0] = 'B'; s3[0] = 'B'; printf("%p\n", s);
printf("%p\n", s1);
printf("%p\n", s3); printf("Here! s[0]=%c\n", s[0]);
printf("Here! s3[0]=%c\n", s3[0]); // 0000000000404000
// 0000000000404000
// 000000000062FE30
// Here! s[0]=h
// Here! s3[0]=B return 0;
}

三、字符串的输入和输出

字符串赋值

char *t = 'title';
char *s;
s = t;

并没有产生新的字符串,只是让指针s指向了t所指的字符串,对s的任何操作就是对t做的

字符串输入和输出

char string[8];
scanf("%s" , string);
printf("%s" , string);

scanf读入一个单词(到空格、tab、回车为止)

scanf是不安全的,因为不知道要读入的内容的长度

常见错误

  1. char *string;
  2. scanf("%s" , string);
  3. 以为char*是字符串类型,定义了一个字符串类型的变量string就可以直接使用了
  4. 由于没有对string初始化0 , 所以不一定每次运行都出错

四、单字符输入和输出

int putchar(int c);
  1. 向标准输出写一个字符
  2. 返回写了几个字符,EOF(-1)表示写失败
int getchar(void);
  1. 从标准输入读入一个字符
  2. 返回类型是int是为了返回EOF(-1) windows --->Ctrl-z

五、字符串函数strlen

  1. size_t strlen(const char *s);
  2. 返回s的字符串长度(不包括结尾的0)
#include <stdio.h>
#include <string.h> int main(int argc, char const *argv[])
{
char line[] = "hello"; printf("strlen=%lu\n", strlen(line)); printf("sizeof=%lu\n", sizeof(line));
return 0;
}
//strlen=5
// 这个包括了字符串最后的0
//sizeof=6

当然了,也可以自己写一个函数来计算字符串长度

#include <stdio.h>
#include <string.h> // 自定义方法来计算字符串长度
int mylen(const char *s)
{
int idx = 0;
while ( s[idx] != '\0' ){
idx++;
}
return idx;
} int main(int argc, char const *argv[])
{
char line[] = "hello"; printf("strlen=%lu\n", mylen(line)); printf("sizeof=%lu\n", sizeof(line));
return 0;
}

六、字符串函数strcmp

  1. int strcmp(const char *s1 , const char *s2);
  2. 比较两个字符串返回:
    • 0:s1 == s2
    • 1: s1 > s2
    • -1: s1 < s2

七、字符串函数strcpy

  1. char* strcpy(char *restrict dst , const char * restrict src);
  2. 把src的字符串拷贝到dst
  3. restrict表明src和dst不重叠(c99)
  4. 返回dst,为了能连起代码来

复制一个字符串

	char *dst = (char*)malloc(Strlen(src)+1);
strcpy(dst , src);

八、字符串strcat

  1. char* strcat(char *restrict s1 , const char *restrict s2);
  2. 把s2拷贝到s1的后面,接成一个长的字符串
  3. 返回s1
  4. s1必须具有足够的空间

但是这些函数都是不安全的,因为你不知道有没有足够的空间,所以

安全版本:如图

九、字符串搜索函数

  1. char * strchr(const char *s , int c);
  2. char * strrchr(const chat *s int c);
  3. 返回NULL表示没有找到
#include <stdio.h>
#include <string.h>
#include <stdlib.h> int main(int argc, char const *argv[])
{
char s[] = "hello"; char *p = strchr(s, 'l');
// 找到第二个l
p = strchr(p+1,'l');
printf("%s\n", p); return 0;
}

复制给另一个

#include <stdio.h>
#include <string.h>
#include <stdlib.h> int main(int argc, char const *argv[])
{
char s[] = "hello";
char *p = strchr(s, 'l');
char *t = (char*)malloc(strlen(p)+1);
strcpy(t,p);
printf("%s\n", t);
free(t);
// llo
return 0;
}

C语言入门-字符串的更多相关文章

  1. 我为什么反对推荐新人编程C/C++语言入门?

    虽然我接触编程以及计算机时间比较早,但是正式打算转入程序员这个行当差不多是大学第四年的事情 从03年接触计算机,07年开始接触计算机编程, 期间接触过的技术包括 缓冲区溢出(看高手写的shellcod ...

  2. 《C语言入门1.2.3—一个老鸟的C语言学习心得》—清华大学出版社炮制的又一本劣书及伪书

    <C语言入门1.2.3—一个老鸟的C语言学习心得>—清华大学出版社炮制的又一本劣书及伪书 [薛非评] 区区15页,有80多个错误. 最严重的有: 通篇完全是C++代码,根本不是C语言代码. ...

  3. c语言入门教程 / c语言入门经典书籍

    用C语言开始编写代码初级:C语言入门必备(以下两本书任选一本即可) C语言是作为从事实际编程工作的程序员的一种工具而出现的,本阶段的学习最主要的目的就是尽快掌握如何用c语言编写程序的技能.对c语言的数 ...

  4. 【转】c语言入门教程 / c语言入门经典书籍

    用C语言开始编写代码 初级:C语言入门必备 (以下两本书任选一本即可) C语言是作为从事实际编程工作的程序员的一种工具而出现的,本阶段的学习最主要的目的就是尽快掌握如何用c语言编写程序的技能.对c语言 ...

  5. Swift语言入门之旅

    Swift语言入门之旅  学习一门新的计算机语言,传统来说都是从编写一个在屏幕上打印"Hello world"的程序開始的.那在 Swift,我们使用一句话来实现它: printl ...

  6. 《Ruby语言入门教程v1.0》学习笔记-01

    <Ruby语言入门教程v1.0> 编著:张开川 邮箱:kaichuan_zhang@126.com 想要学习ruby是因为公司的自动化测试使用到了ruby语言,但是公司关于ruby只给了一 ...

  7. 【南阳OJ分类之语言入门】80题题目+AC代码汇总

    小技巧:本文之前由csdn自动生成了一个目录,不必下拉一个一个去找,可通过目录标题直接定位. 本文转载自本人的csdn博客,复制过来的,排版就不弄了,欢迎转载. 声明: 题目部分皆为南阳OJ题目. 代 ...

  8. C语言入门(7)——自定义函数

    C源程序是由函数组成的.虽然在C语言入门系列前面几篇的程序中大都只有一个主函数main(),但实用程序往往由多个函数组成.函数是C源程序的基本模块,通过对函数模块的调用实现特定的功能.C语言中的函数相 ...

  9. C语言入门教程-(5)格式化输入输出

    1.输入和输出 在程序的使用中,我们经常可以看的这么一个场景:用户需要输入数据,经过程序运算,得到结果后输出.在C语言中,输入数据和输出数据都是由库函数完成的,通过语句来输入/输出. 2.格式化输出— ...

随机推荐

  1. kafka消息分发策略分析

    当我们使用kafka向指定Topic发送消息时,如果该Topic具有多个partition,无论消费者有多少,最终都会保证一个partition内的消息只会被一个Consumer group中的一个C ...

  2. About 睡觉觉吃饭饭

    rdc 的日常作息: 11:50 左右起床,洗漱后飞奔到超市买咖啡饼干,然后飞奔到实验室. 开始被比赛打:比赛前期觉没睡醒,题没读懂就开始乱写,签到签不上,比赛中期处于要被饿死的状态. 赛后吃饭饭,随 ...

  3. Codeforces Round #486 (Div. 3)988E. Divisibility by 25技巧暴力||更暴力的分类

    传送门 题意:给定一个数,可以对其做交换相邻两个数字的操作.问最少要操作几步,使得可以被25整除. 思路:问题可以转化为,要做几次交换,使得末尾两个数为00或25,50,75: 自己一开始就是先for ...

  4. CF915C Permute Digits 字符串 贪心

    You are given two positive integer numbers a and b. Permute (change order) of the digits of a to con ...

  5. CodeForces 103D Time to Raid Cowavans 询问分块

    Time to Raid Cowavans 题意: 询问 下标满足 a + b * k 的和是多少. 题解: 将询问分块. 将b >= blo直接算出答案. 否则存下来. 存下来之后,对于每个b ...

  6. 杭电多校第九场 hdu6425 Rikka with Badminton 组合数学 思维

    Rikka with Badminton Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/O ...

  7. 爬虫反爬之代理IP

    爬虫反爬之代理IP 代理IP其实本就是在requests模块中的参数 定义: 代替原来的IP地址去对接网络的IP地址. 作用: 隐藏自身真实IP,避免被封. 获取代理IP网站 西刺代理.快代理.全网代 ...

  8. 《Hive编程指南》读书笔记 | 一文看懂Hive的数据类型和文件格式

    Hive支持关系型数据库中的大多数基本数据类型,同时也支持关系型数据库中很少出现的3种集合数据类型. 和大多数数据库相比,Hive具有一个独特的功能,那就是其对于数据在文件中的编码方式具有非常大的灵活 ...

  9. 基于Selenium+Python的web自动化测试框架

    一.什么是Selenium? Selenium是一个基于浏览器的自动化测试工具,它提供了一种跨平台.跨浏览器的端到端的web自动化解决方案.Selenium主要包括三部分:Selenium IDE.S ...

  10. java 中for循环中断的办法

    /* 中断for循环的办法: 1.break ***2.return是结束方法的,不是结束循环的. 3.标签的方法. 格式: 表签名:语句 运行结果:D:\test\day0413>java T ...