C语言基础-第四课-数组与字符串

1   数组

1.1   一维数组定义与使用


int array[10];//定义一个一维数组,名字叫array,一共有10个元素,每个元素都是int类型的

array[0] = 20;

array[1] = 30;

array[9] = 80;

//array[10] = 100;//错误,没有 array[10]这个元素

1.2   数组在内存的存储方式

数组在内存中就是一段连续的空间,每个元素的类型是一样的

1.3   一维数组初始化


int array[10] = { 100, 1, 5, 3, 4, 5, 6, 7, 8, 0 };//定义数组的同时为数组的成员初始化值


int array[10] = { 3, 7, 9 };//将数组的前三个元素赋值,其余元素置为0


int array[10] = { 0 };//将数组所有的元素都置为0


int i;

for (i = 0; i < 10; i++)

{

array[i] = 0;//通过循环遍历数组的每个元素,将元素的值置为0

}

1.4   二维数组定义与使用


int array[2][3];//定义了一个二维数组,有两个array[3]

1.5   二维数组初始化


int a[3][4] = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } };

2   字符串与字符数组

2.1   字符数组定义


char array[100];

2.2   字符数组初始化


char array[100] = {‘a‘, ‘b‘, ‘c‘,‘d‘};


char array[100] = "abcd";


char array[100] = { 0 };


char array[] = "abcd";

2.3   字符数组使用

2.4   随机数产生函数rand与srand

头文件stdlib.h

Rand是伪随机数产生器,每次调用rand产生的随机数是一样的

如果调用rand之前先调用srand就出现任意的随机数

只要能保证每次调用srand函数的时候,参数的值是不同的,那么rand函数就一定会产生不同的随机数


#include <time.h>

int t = (int)time(NULL);

srand(t);

for (int i = 0; i < 10; i++)

{

printf("%d\n", rand());

}

 

 

2.5   用scanf输入字符串


char s[10] = { 0 };

scanf("%s", s);//"%s"的作用就是输入一个字符串的,scanf是以回车键作为输入完成标示的,但回车键本身并不会作为字符串的一部分

//如果scanf参数中的数组长度小于用户在键盘输入的长度,那么scanf就会缓冲区溢出,导致程序崩溃

int i;

for (i = 0; i < 10; i++)

{

printf("%d\n", s[i]);

}

printf("----------------------------------\n");

printf("%s\n", s);

return 0;

2.6   字符串的结束标志

Scanf将回车,空格都认为是字符串输入结束标志,

2.7   字符串处理函数

2.7.1   gets


char s[100] = { 0 };

gets(s);//gets认为回车的输入结束标示,空格不是输入结束标示,所以用gets这个函数就可以实现输入带空格的字符串

//gets和scanf一样存在缓冲区溢出的问题

int i;

for (i = 0; i < 10; i++)

{

printf("%d\n", s[i]);

}

printf("----------------------------------\n");

printf("%s\n", s);

Gets不能用类似“%s”或者“%d”之类的字符转义,只能接受字符串的输入

2.7.2   fgets函数

gets函数不检查预留缓冲区是否能够容纳用户实际输入的数据。多出来的字符会导致内存溢出,fgets函数改进了这个问题。

由于fgets函数是为读取文件设计的,所以读取键盘时没有gets那么方便


char s[100] = { 0 };

fgets(s, sizeof(s), stdin);

2.7.3   puts函数

puts函数打印字符串,与printf不同,puts会在最后自动添加一个’\n’


char s[] = "hello world";

puts(s);

2.7.4   fputs函数

fputs是puts的文件操作版本,


char s[] = "hello world";

fputs(s, stdout);

2.7.5   strlen,字符串长度

size_t  strlen(const char * _Str);

返回不包含字符串结尾’\0’的字符串长度


char s[100] = "hello world";

int len = strlen(s);//得到字符串长度,返回一个字符串中有效字符的数量(不包含字符串结尾的0)

printf("len = %d\n", len);

return 0;

2.7.6   strcat,字符串追加

size_t  strcat(char * _Str1, const char * _Str2);

将参数_Str2追加到_Str1后尾


char s[1024] = "hello world";

int len = strlen(s);//得到字符串长度,返回一个字符串中有效字符的数量(不包含字符串结尾的0)

printf("len = %d\n", len);

char s1[100] = "abc123456789";

strcat(s, s1);//将两个字符串合并,结果放入第一个参数里面,strcat也存在缓冲区溢出的问题

printf("%s\n", s);

2.7.7   strncat,字符串有限追加

size_t  strncat(char * _Str1, const char * _Str2, size_t len);

2.7.8   strcmp,字符串比较

int strcmp(const char * _Str1, const char * _Str2);

比较两个字符串是否相等,相等返回0,不等返回非0

2.7.9   strncmp,字符串有限比较

2.7.10   strcpy字符串拷贝

char *strcpy(char * _Str1, const char * _Str2);

将参数_Str2拷贝到参数_Str1中

2.7.11   strncpy字符串有限拷贝

2.7.12   sprintf,格式化字符串

和printf函数功能类似,printf函数将格式化结果输出到屏幕,sprintf将格式化结果输出到字符串

2.7.13   Sscanf函数

Sscanf类似于scanf函数,,scanf从键盘读取用户输入,scanf从指定格式化字符串读取输入

2.7.14   strchr查找字符

char * strchr(char * _Str, int _Ch);

在参数_str中查找参数_Ch指定字符,找到返回字符_Ch在_Str中所在位置,没有找到返回NULL;

2.7.15   strstr查找子串

char * strstr(char * _Str, const char * _SubStr)

在参数_str中查找参数_SubStr指定子串,找到返回子串在_Str中所在位置,没有找到返回NULL;

2.7.16   strtok分割字符串

字符在第一次调用时strtok()必需给予参数s字符串,往后的调用则将参数s设置成NULL每次调用成功则返回指向被分割出片段的指针


char buf[] = "[email protected]@igk";

char *p = strtok(buf, "@");

while (p)

{

printf("%s\n", p);

p = strtok(NULL, "@");

}

2.7.17   atoi转化为int

需要包含头文件stdlib.h

2.7.18   atof转化为float

2.7.19   atol转化为long

时间: 2024-08-01 21:01:49

C语言基础-第四课-数组与字符串的相关文章

第五天:语言基础(四)

Java 中的运算符 一门编程语言,最常坐的工作就是数据运算.在 Java 中,有丰富的运算符来进行数值运算.这些运算符可以分为以下几类: 算数运算符 关系运算符 位运算符 逻辑运算符 赋值运算符 其它运算符 算数运算符 先来说说算数运算符. 操作符 描述 说明 + 加--运算符两侧的值进行相加 注意类型转换 - 减--左操作数减去右操作数 注意类型转换 * 乘--运算符两侧的值进行相乘 注意类型转换 / 除--左操作数除以右操作数 注意左右操作数类型的不同,结果的类型也不同 % 取余--左操作

C语言基础学习3:数组与指针

数组元素的指针就是数组元素的地址. 1.指向数组元素的指针 C语言规定数组名(不包括形参数组名,形参数组并不占据实际的内存单元)代表数组中的首元素(即序列为0的元素)的地址. int a[10]; int *p1,*p2; p1 = &a[0]; p2 = a; p1和p2指向同一个数组a[10]. 2.通过指针引用数组元素 按C语言的规定,如果指针变量p已指向数组中的一个元素,则p+1指向同一个数组中的下一个元素,而不是将p的值(地址)简单的加1. 如果p的初值为&a[0],则 (1)

C语言基础课程 第一课 Linux环境配置小实战httpserver

?? C语言基础课程 第一课 Linux环境配置小实战httpserver 首先环境需要的是redhat虚拟机操作系统 打开redhat 防火墙 2.将WWW(HTTP)勾选上 3.点击apply 点击是 4.切换到root用户 输入正确的root密码 5. 启动http服务 6.输入ifconfig 查看当前ip 痛 7.通过分析我们知道 他是一个局域网的ip   windows可以通过net 或者 主机模式与Linux进行通信 如果不想改变本地ip地址的话  我们需要改变虚拟机的ip地址 和

苹果新的编程语言 Swift 语言进阶(四)--字符串和收集类型

一.字符串( String  )和字符类型(Character) 字符串是一种字符的带次序的收集类型(相当于数组),字符是字符串中的元素. 在Swift 语言中,字符串是编码独立的Unicode字符的组合,并提供相应方法来获取以各种Unicode呈现方式包含的字符. 1. 字符串定义和初始化 Swift 语言使用var或let关键字来定义一个常量字符串(不可修改)或变量字符串(可以修改).  而不是像Object C语言一样定义两种不同的类型. Swift 语言允许使用一个双引号的字符串来初始化

第四章 数组,字符串和指针

数组 数组若没有指定初始值则为内存遗留值 如果指定了部分初始值,那么其余部分也默认被指定为0: long data[100]={0};          //给data数组的所有元素赋0 字符串是附加有特殊字符(/0)的字符序列 数组的填充: char president[]="thank you"; wchar_t president[]=L"thank you";     //Unicode字符串 const int max=80; char name[max]

[Coursera][计算导论与C语言基础][Week 10]对于“数组应用练习”课后习题的思考题的一些想法

(首先,关于Honor Code,我咨询过了Help Center,分享课后练习的思考题的想法是可以的(注意不是代码),但要标明引用,引用格式来源于https://guides.lib.monash.edu/citing-referencing/apa-university-course-materials.) 北京大学(Producer). (2019) . 计算导论与C语言基础[Coursera] . Retrieved from https://www.coursera.org/learn

C++语言基础(24)-四种类型转换运算符(static_cast、dynamic_cast、const_cast和reinterpret_cast)

一.static_cast static_cast 只能用于良性转换,这样的转换风险较低,一般不会发生什么意外,如: #include <iostream> #include <cstdlib> using namespace std; class Complex{ public: Complex(double real = 0.0, double imag = 0.0): m_real(real), m_imag(imag){ } public: operator double(

C语言基础-第五课-函数

1   函数 1.1   函数的原型和调用 在使用函数前必须定义或者声明函数 double circle(double r); int main() { double length = circle(10); printf("length = %f\n", length); return 0; } double circle(double r) { return 2 * 3.14 * r; } 1.2   函数的形参与实参 在调用函数的时候,函数大多数都有参数,主调函数和被调用函数之间

JAVA学习第四课(数组)

数组: 同一类型数据的集合,即一种容器. 定义方式: int[] atrr = new int[5];//int 型数组 数组名arr ,new动态开辟  int[5],数组大小为5,只能存放5个元素, 下标0-4 数组定义后在内存中的基本分布: 内存的划分: 1.寄存器 -> CPU 2.本地方法区,与所在系统相关 3.方法区 4.栈内存: 存储的都是局部变量,且变量所属的作用域一旦结束,当前变量就会自动释放,所以 栈内存更新速度很快,因为栈内变量的生命周期都很短(结束就释放). 例如:局部代