歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> Linux技術

Linux C 第五課

*書寫定義宏用大寫

*數組名是常量,代表數組的地址,存儲數組的地址

*if(6 == num) // 使用 == 是將常數寫在等號左邊

{

}

*if(),while(),for() 括號後面都不可以加 ;

*邏輯運算符

① && 短路與 當符號左邊為 0 時,結果為0,後面的不計算

② ||短路非 當符號左邊為1時,結果為1,後面的不計算

③ !非

*常量都是有符號數,有用強制轉換轉為無符號數(unsigned int)

*有符號數與無符號數預算轉換為有符號數

*位運算 要對無符號數進行操作

*位運算 要借助掩碼(unsigned int mask)

* &使用場合

①清零特定位,先寫掩碼,掩碼特定位為0,其他位為1

②取某數的特定位,先寫掩碼,掩碼特定位為1,其他位為0

*有符號數 >> 補符,<< 補零

無符號數 >> << 補零

* | 使用場合 特定位置1,先寫補碼,特定位為1,其他位為0

* ^ 異或 使用場合

①使特定位取反

②不使用中間變量交換兩數的值

*指針

☆對應的內存空間

☆指向的內存空間

num++;對num對應的內存空間裡面的值加1

p++;對p對應的內存空間裡面的值加1(一個步長)

*(p)++;根據p對應的內存空間裡的地址找到其對應的內存空間,

即對p指向的內存空間操作

*巨指針(遠指針):超過二維的指針

*

*野指針:隨機指向一塊內存的指針,

*野指針造成的錯誤:導致內存洩漏

*造成內存洩漏的原因:

①指向一塊沒有訪問權限的內存

②訪問一塊已經釋放的內存

*如何避免產生野指針

①聲明一個指針時要注意初始化,int * p = NULL;

②分配完內存以後要檢查指針是否不為空

③釋放內存空間後,要給指針賦值,p = NULL;

④不要在另外一個函數中釋放本函數的指針

⑤返回局部變量的地址時,最好使用靜態局部變量,以防止函數調用結束後,引發段錯誤

*字符串的名字就是首字符的地址

*盡量不要使用形參作為工作變量

*對字符串操作的函數

strlen,strcpy,strncpy,strcmp,strncmp,strcat,strncat

*my_strlen

[code]#include<stdio.h>
#define MAX_SIZE 1024

int my_strlen(char *s)
{
    int len = 0;

    while(*s != '\0')
    {
        len++;
        s++;
    }
    return len;
}

int main()
{
    char str[MAX_SIZE];
    int len;
    printf("please input a string:\n");
    scanf("%s",str);

    len = my_strlen(str);

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

    return 0;
}
*my_strcpy my_strncpy

[code]#include<stdio.h>
#define MAX_SIZE 1024

char * my_strcpy(char *dest,char *str)
{
    char *tmp = dest;

    while(*str != '\0')
    {
        *tmp = *str;
        tmp++;
        str++;
    }

    tmp = '\0';

    return dest;
}

char * my_strncpy(char *dest,char *str,int n)
{
    int i;
    char *tmp = dest;

    for(i = 0;i < n;i++)
    {
        *tmp = *str;
        tmp++;
        str++;
    }

    tmp = '\0';

    return dest;
}

int main()
{
    char dest[MAX_SIZE];
    char str[MAX_SIZE];
       char *tmp;

    printf("please input a string:\n");
    scanf("%s",str);

    tmp =  my_strcpy(dest,str);
    printf("tmp = %s\n",tmp);
    printf("dest = %s\n",dest);

    tmp = my_strncpy(dest,str,5);
    printf("tmp = %s\n",tmp);
    printf("dest = %s\n",dest);

    return 0;
}
*my_strcat my_strncat

[code]#include<stdio.h>
#define MAX_SIZE 1024

char * my_strcat(char *dest,char *str)
{
    char *tmp = dest;
    while(*tmp != '\0')
    {
        tmp++;
    }
    while(*str != '\0')
    {
        *tmp = *str;
        str++;
        tmp++;
    }

    tmp = '\0';

    return dest;
}

char * my_strncat(char* dest,char *str,int n)
{
    char *tmp = dest;
    int i;

    while(*tmp != '\0')
    {
        tmp++;
    }
    for(i = 0;i < n;i++)
    {
        *tmp = *str;
        tmp++;
        str++;
    }

    *tmp = '\0';

    return dest;
}

int main()
{
    char dest[MAX_SIZE] = "abcdefg";
    char str[MAX_SIZE];
       char *tmp;

    printf("please input a string:\n");
    scanf("%s",str);

    tmp = my_strcat(dest,str);
    printf("tmp = %s\n",tmp);
    printf("dest = %s\n",dest);

    tmp = my_strncat(dest,str,2);
    printf("tmp = %s\n",tmp);
    printf("dest = %s\n",dest);

    return 0;
}
*my_strcmp my_strncmp

[code]#include<stdio.h>
#define MAX_SIZE 1024

int my_strcmp(char *dest,char *str)
{
    while(*str != '\0' && *dest !='\0')
    {
        if(*dest > *str)
        {
            return 1;
        }
        if(*dest < *str)
        {
            return -1;
        }
        dest++;
        str++;
    }
    if(*str == '\0' && *dest != '\0')
    {
        return 1;
    }
    if(*str != '\0' && *dest == '\0')
    {
        return -1;
    }

    return 0;
}

int my_strncmp(char *str,char *p,int len)
{
    int i;

    for(i = 0;i < len;i++)
    {
        if (*(str+i) != *(p + i))
        {
            return 1;
        }
    }

    return 0;
}

int main()
{
    char dest[MAX_SIZE] = "abcdefg";
    char str[MAX_SIZE];
       char *tmp;

    printf("please input a string:\n");
    scanf("%s",str);

    int value = my_strcmp(dest,str);
    printf("vlaue = %d\n",value);
    return 0;
}
*memcpy

1.功能

memcpy是c和c++使用的內存拷貝函數,memcpy函數的功能是從源src所指的內存地址的起始位置開始拷貝n個字節到目標dest所指的內存地址的起始位置中

2.函數

void * memcpy(void *dest, const void *src, size_t n);//函數返回指向dest的指針。

3.注意事項

①source和destin所指的內存區域可能重疊,但是如果source和destin所指的內存區域重疊,那麼這個函數並不能夠確保source所在重疊區域在拷貝之前不被覆蓋。而使用memmove可以用來處理重疊區域。函數返回指向destin的指針.

②如果目標數組destin本身已有數據,執行memcpy()後,將覆蓋原有數據(最多覆蓋n)。如果要追加數據,則每次執行memcpy後,要將目標數組地址增加到你要追加數據的地址。

注意:source和destin都不一定是數組,任意的可讀寫的空間均可。

4.strcpy和memcpy主要有以下3方面的區別。

1、復制的內容不同。strcpy只能復制字符串,而memcpy可以復制任意內容,例如字符數組、整型、結構體、類等。

2、復制的方法不同。strcpy不需要指定長度,它遇到被復制字符的串結束符”\0”才結束,所以容易溢出。memcpy則是根據其第3個參數決定復制的長度。

3、用途不同。通常在復制字符串時用strcpy,而需要復制其他類型數據時則一般用memcpy

*memcmp

1.功能

memcmp是比較內存區域buf1和buf2的前count個字節。該函數是按字節比較的。

2.函數

int memcmp(const void *buf1, const void *buf2, unsigned int count);

3.所需頭文件

[code]#include <string.h>或#include<memory.h>
4.返回值

當buf1 > buf2時,返回值<0

當buf1==buf2時,返回值=0

當buf1>buf2時,返回值>0

5.該函數是按字節比較的。

例如:

s1,s2為字符串時候memcmp(s1,s2,1)就是比較s1和s2的第一個字節的ascII碼值;

memcmp(s1,s2,n)就是比較s1和s2的前n個字節的ascII碼值;

如:char *s1=”abc”;

char *s2=”acd”;

int r=memcmp(s1,s2,3);

就是比較s1和s2的前3個字節,第一個字節相等,第二個字節比較中大小已經確定,不必繼續比較第三字節了。所以r=-1

Copyright © Linux教程網 All Rights Reserved