赞
踩
嵌入式入门学习笔记,遇到的问题以及心得体会!
DAY6
概括:
一,字符串处理相关的函数:
1,strlen
2,strcpy(strncpy)
3,strcat(strncat)
4,strcmp(strncmp)
二,二维数组
数组的特点:
(1)数据类型相同
(2)内存连续
如何定义一个一维数组?
存储类型 数据类型 数组名[元素个数];
如何定义一个二维数组?
存储类型 数据类型 数组名[行数][列数];
三、指针:
地址:内存单元的编号(内存都是以字节为单位进行划分,以编号的形式来代表每一个字节在内存中的位置)
指针:因为一个编号(地址)对应一个独立的字节空间,有这种指向关系存在,所以形象的把地址也称为指针
笔记:
一维字符数组:本质:就是一个字符串
一,字符串处理相关的函数:
1,strlen
2,strcpy(strncpy)
3,strcat(strncat)
4,strcmp(strncmp)
(1)strlen :
函数功能:求字符串长度的函数
#include <string.h> //头文件
//函数原型:
size_t strlen(const char *s);
简易版:
int strlen(数组名);
#include <stdio.h>
#include <string.h>
int main(int argc, const char *argv[])
{
char str[20] = {0};
gets(str);
//int len_str = strlen(str);
//printf("len_str = %d\n",len_str);
printf("len_str= %d\n",strlen(str));
return 0;
}
(2)strcpy: 复制字符串
#include <string.h>
char *strcpy(char *dest, const char *src);
char *strncpy(char *dest, const char *src, size_t n);
简化版:
strcpy(数组名1,数组名2);----》将数组2中的内容复制到数组1中去
#include <stdio.h> #include <string.h> #define M 20 #define N 10 int main(int argc, const char *argv[]) { //实现字符串之间的拷贝 char str1[M] = {'\0'}; char str2[N] = {0}; printf("请输入两个字符串:\n"); gets(str1); scanf("%s",str2); printf("before: str1 = %s\n",str1); printf("请输入需要拷贝的字符的个数:\n"); int count; scanf("%d",&count); //越界检查 if(count + 1 > M) { printf("str1 is so short!\n"); return -1;//-1一般代表程序异常退出 } strncpy(str1,str2,count); printf("after: str1 = %s\n",str1); return 0;//0代表成功正常退出 }
strncpy(数组名1,数组名2,N) ;–>将数组2中的前N个字符内容复制到数组1中去
#include <stdio.h> #include <string.h> #define M 20 #define N 10 int main(int argc, const char *argv[]) { //实现字符串之间的拷贝 char str1[M] = {'\0'}; char str2[N] = {0}; printf("请输入两个字符串:\n"); gets(str1); scanf("%s",str2); printf("before: str1 = %s\n",str1); printf("请输入需要拷贝的字符的个数:\n"); int count; scanf("%d",&count); //越界检查 if(count + 1 > M) { printf("str1 is so short!\n"); return -1;//-1一般代表程序异常退出 } strncpy(str1,str2,count); printf("after: str1 = %s\n",str1); return 0;//0代表成功正常退出 }
(3)strcat :连接字符串函数
#include <string.h>
char *strcat(char *dest, const char *src);
char *strncat(char *dest, const char *src, size_t n);
简易版:
strcat(数组名1,数组名2);–》将数组2中的字符连接在数组1的后面
strncat(数组名1,数组名2,N);—》将数组2中前N个字符连接在数组1的后面
#include <stdio.h> #include <string.h> int main(int argc, const char *argv[]) { char str1[20] = {0}; char str2[10] = {0}; gets(str1); gets(str2); printf("连接之前:str1 = %s\n",str1); //越界检查 if(20 < strlen(str1) + strlen(str2) + 1) { printf("str1 is so short!\n"); return -1; } strcat(str1,str2); printf("连接之后:str1 = %s\n",str1); return 0; }
(4)strcmp : 比较函数
#include <string.h>
int strcmp(const char *s1, const char *s2);
int strncmp(const char *s1, const char *s2, size_t n);
简易版:
int strcmp(数组名1,数组名2);
比较规则:
取两个字符串中第一对字符进行比较:
此时如果第一对字符相等,则进行判断下一对字符,如果该对字符不相等,则因为ASCII值的存在,就会有正负之分
对于该函数的返回值:
当返回值 == 0时,代表两个字符串相等
当返回值大于0时,代表数组1 > 数组2
当返回值小于0时,代表数组1 < 数组2
#include <stdio.h> #include <string.h> int main(int argc, const char *argv[]) { char str1[20] = {0}; char str2[10] = {0}; gets(str1); gets(str2); int count; printf("请输入:\n"); scanf("%d",&count); int Value = strncmp(str1,str2,count); if(0 == Value) { printf("str1 == str2!\n"); } else if(Value > 0) { printf("str1 > str2!\n"); } else { printf("str1 < str2!\n"); } return 0; }
二,二维数组
数组的特点:
(1)数据类型相同
(2)内存连续
如何定义一个一维数组?
存储类型 数据类型 数组名[元素个数];
如何定义一个二维数组?
存储类型 数据类型 数组名[行数][列数];
要求:定义一个2行3列的整形二维数组?
—》int arr[2][3] = {1,2,3,4,5,6};
1 2 3
4 5 6
#include <stdio.h> #define M 2 #define N 3 int main(int argc, const char *argv[]) { int arr[M][N] = {{1},{4,5}}; //定义两个循环变量 int i,j; for(i=0;i<M;i++) { for(j=0;j<N;j++) { scanf("%d",&arr[i][j]); } } printf("输出为:\n"); //第一个for循环用来控制行数 for(i=0;i<M;i++) { //第二个for循环用来控制每一行中元素的个数 for(j=0;j<N;j++) { printf("%d ",arr[i][j]); } printf("\n"); } return 0; }
总结:
二维数组的行数:代表包含一维数组的个数
二维数组的列数:代表包含的每一个一维数组中元素的个数
注意:二维数组额行数可以省略不写,但是列数不可以省略!!!
二维字符数组:
定义一个可以存放三个字符串的二维字符数组?
----》char str[3][20] = {{‘h’,‘a’,‘h’,‘a’},{‘x’,‘i’,‘x’,‘i’},{‘G’,‘a’,‘G’,‘a’}};
char str[3][20] = {{“haha”},{“xixi”},{“GaGa”}};
char str[3][20] = {“haha”,“xixi”,“GaGa”};
#include <stdio.h> int main(int argc, const char *argv[]) { char str[3][20] = {"wangjia","haha","GaGa"}; int i; printf("请输入:\n"); for(i=0;i<3;i++) { gets(str[i]); } //用该循环来控制所需要打印的字符串的个数 for(i=0;i<3;i++) { puts(str[i]); } return 0; }
指针:
地址:内存单元的编号(内存都是以字节为单位进行划分,以编号的形式来代表每一个字节在内存中的位置)
指针:因为一个编号(地址)对应一个独立的字节空间,有这种指向关系存在,所以形象的把地址也称为指针
指针:
可以分为指针常量和指针变量
指针常量:就是内存中的一个编号 —》不能自加和自减
指针变量:专门用来存储地址的一类变量 --》可以自加和自减
如何定义一个指针变量?
—》存储类型 数据类型 *指针变量名;
分析:
存储类型:该指针变量自身的存储类型
数据类型:指针所指向(目标)类型
数据类型 * :指针自身的数据类型
指针变量名:表示该指针在内存中的空间的名字
注意: 指针定义格式中的*只是一个标识符,标识当前这个变量是一个用来存储地址的一类变量,而不是普通变量
如何确定指针一次性访问空间大小?
----》由指针所指向的类型来决定
int *p —>p一次性访问4个字节
char *p —>p一次性访问1个字节
作业:
(1)自己实现strcpy,strcat,strcmp
1.实现strcat
#include <stdio.h> #define M 20 #define N 10 int main(int argc, const char *argv[]) { //实现strcat的功能 char str1[M] = {'\0'}; char str2[N] = {'\0'}; printf("请输入:\n"); gets(str1); gets(str2); //定义两个循环变量 int i = 0,j = 0; //第一步:遍历str1字符串到第一个'\0'位置处 /*while(str1[i]) { i++; }*/ while(str1[i++]); i--; //第二步:遍历str2字符串,并将每一个有效字符赋值在str1的后面 while(str2[j]) { str1[i++] = str2[j++]; //i++; //j++; } printf("连接之后的str1 = %s\n",str1); return 0; }
2.实现strcpy
#include <stdio.h> #define M 20 #define N 10 int main(int argc, const char *argv[]) { //实现两个字符串之间的拷贝 char str1[M] = {'\0'}; char str2[N] = {'\0'}; printf("请输入两个字符串:\n"); gets(str1); gets(str2); int i = 0; //遍历str2这个字符串,并将每一个有效字符赋值给str1对应的位置 while(str2[i]) { str1[i] = str2[i]; i++; } //手动添加'\0' str1[i] = '\0'; printf("复制之后的str1 = %s\n",str1); return 0; }
3.实现strcmp
#include <stdio.h> #define M 20 #define N 10 int main(int argc, const char *argv[]) { //实现strcmp的功能 char str1[M] = {'\0'}; char str2[N] = {'\0'}; printf("请输入:\n"); gets(str1); gets(str2); int i; for(i=0;str1[i] == str2[i];i++) { if('\0' == str1[i]) { printf("str1 == str2!\n"); return 0; } } int Value = str1[i] - str2[i]; if(Value > 0) { printf("str1 > str2!\n"); } else { printf("str1 < str2!\n"); } return 0; }
(2)事先杨辉三角的打印
1
1 1
1 2 1
类似于这种金字塔的样子进行输出
#include <stdio.h> #define N 20 int main() { int a[N][N]={0}; int i,j,k,n=0; printf("请输入杨輝三角的行数:\n"); scanf("%d",&n); for(i=0;i<n;i++) { for(j=0;j<=i;j++) { if(j == 0 || i == j) { a[i][j] = 1; } else { a[i][j] = a[i-1][j-1] + a[i-1][j]; } } } printf("%d行杨輝三角的图形如下:\n",n); for(i=0;i<n;i++) { for(k=0;k<n-1-i;k++) { printf(" "); } for(j=0;j<=i;j++) { printf("%d ",a[i][j]); } printf("\n"); } return 0; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。