嵌入式入門學習筆記,遇到的問題以及心得體會!
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;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/265639.html
標籤:其他
