真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

C語(yǔ)言字符串+字符串函數(shù)-創(chuàng)新互聯(lián)

字符串 字符串

字符數(shù)組
char word[] = {‘H’, ‘e’, ‘l’, ‘l’, ‘o’,‘!’};
字符串

成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站、成都外貿(mào)網(wǎng)站建設(shè)公司服務(wù)團(tuán)隊(duì)是一支充滿著熱情的團(tuán)隊(duì),執(zhí)著、敏銳、追求更好,是創(chuàng)新互聯(lián)的標(biāo)準(zhǔn)與要求,同時(shí)竭誠(chéng)為客戶提供服務(wù)是我們的理念。創(chuàng)新互聯(lián)建站把每個(gè)網(wǎng)站當(dāng)做一個(gè)產(chǎn)品來(lái)開(kāi)發(fā),精雕細(xì)琢,追求一名工匠心中的細(xì)致,我們更用心!
char word[] = {‘H’, ‘e’, ‘l’, ‘l’, ‘o’,‘!’,’ \0’};
  • 以0(整數(shù)0)結(jié)尾的?串字符
    • 0或’\0’是?樣的,但是和’0’不同
  • 0標(biāo)志字符串的結(jié)束,但它不是字符串的?部分
    • 計(jì)算字符串?度的時(shí)候不包含這個(gè)0
  • 字符串以數(shù)組的形式存在,以數(shù)組或指針的形式訪問(wèn)
    • 更多的是以指針的形式
  • string.h ?有很多處理字符串的函數(shù)

字符串變量

char *str = “Hello”; 
char word[] = “Hello”; 
char line[10] = “Hello”;
  • “Hello”

  • ″Hello″ 會(huì)被編譯器變成?個(gè)字符數(shù)組放在某處,這個(gè)數(shù)組的?度是6,結(jié)尾還有表?結(jié)束的0

  • 兩個(gè)相鄰的字符串常量會(huì)被?動(dòng)連接起來(lái)

  • ?末的\表?下??還是這個(gè)字符串常量

  • C語(yǔ)?的字符串是以字符數(shù)組的形態(tài)存在的

    • 不能?運(yùn)算符對(duì)字符串做運(yùn)算
    • 通過(guò)數(shù)組的?式可以遍歷字符串
  • 唯?特殊的地?是字符串字?量可以?來(lái)初始化字符數(shù)組

  • 以及標(biāo)準(zhǔn)庫(kù)提供了?系列字符串函數(shù)

字符串常量
char* s = "Hello, world!";
  • s 是?個(gè)指針,初始化為指向?個(gè)字符串常量
    • 由于這個(gè)常量所在的地?,所以實(shí)際上s是 const char* s ,但是由于歷史的原因,編譯器接受不帶 const的寫(xiě)法
    • 但是試圖對(duì)s所指的字符串做寫(xiě)?會(huì)導(dǎo)致嚴(yán)重的后果
  • 如果需要修改字符串,應(yīng)該?數(shù)組: char s[] = “Hello, world!”;
    什么時(shí)候用指針,什么時(shí)候用數(shù)組
    char * str = “Hello”;
    char word[] = “Hello”;
  • 數(shù)組:這個(gè)字符串在這?
    • 作為本地變量空間?動(dòng)被回收
  • 指針:這個(gè)字符串不知道在哪?
    • 處理參數(shù)
    • 動(dòng)態(tài)分配空間
      如果要構(gòu)造?個(gè)字符串—>數(shù)組
      如果要處理?個(gè)字符串—>指針

      char*是字符串
      字符串可以表達(dá)為char的形式
      char
      不?定是字符串
      本意是指向字符的指針,可能指向的是字符的數(shù)組(就像int* ?樣)
      只有它所指的字符數(shù)組有結(jié)尾的0,才能說(shuō)它所指的是字符串
字符串的輸入和輸出

字符串賦值?

  • char * t = “title”;
  • char * s;
  • s = t;
  • 并沒(méi)有產(chǎn)?新的字符串,只是讓指針s指向了t所指的字符串,對(duì)s的任何操作就是對(duì)t做的
    字符串輸?輸出
char string[8]; 
scanf(“%s”, string); 
printf(“%s”, string);

scanf讀??個(gè)單詞(到空格、tab或回?為?)
scanf是不安全的,因?yàn)椴恢酪x?的內(nèi)容的?度
安全的輸?
char string[8];
scanf(“%7s”, string);
在%和s之間的數(shù)字表?最多允許讀?的字符的數(shù)量,這個(gè)數(shù)字應(yīng)該?數(shù)組的????
下?次scanf從哪?開(kāi)始?
下一次scanf從上一個(gè)第八個(gè)開(kāi)始
常?錯(cuò)誤

  • char * string;
  • scanf(“%s”, string);
  • 以為char* 是字符串類(lèi)型,定義了?個(gè)字符串類(lèi)型的變量string就可以直接使?了
    • 由于沒(méi)有對(duì)string初始化為0,所以不?定每次運(yùn)?都出錯(cuò)
      空字符串
      char buffer[100]=””;
這是?個(gè)空的字符串,buffer[0] == ‘\0’

char buffer[] = “”;
這個(gè)數(shù)組的?度只有1!

字符串?dāng)?shù)組
? char **a 
? a是?個(gè)指針,指向另?個(gè)指針,那個(gè)指針指向?個(gè)字符(串) 
? char a[][] 
? a是?個(gè)?維數(shù)組,第?個(gè)維度的??不知道,不能編譯 
? char a[][10] 
? a是?個(gè)?維數(shù)組,a[x]是?個(gè)char[10] 
? char *a[] 
? a是?個(gè)?維數(shù)組,a[x]是?個(gè)char*

程序參數(shù)

  • int main(int argc, char const * argv[])
  • argv[0]是命令本?
  • 當(dāng)使?Unix的符號(hào)鏈接時(shí),反映符號(hào)鏈接的名字
字符串函數(shù) 單字符輸入輸出,用putchar和getchar

putchar

  • int putchar(int c);
  • 向標(biāo)準(zhǔn)輸出寫(xiě)?個(gè)字符
  • 返回寫(xiě)了?個(gè)字符,EOF(-1)表?寫(xiě)失敗

getchar

  • int getchar(void);
  • 從標(biāo)準(zhǔn)輸?讀??個(gè)字符
  • 返回類(lèi)型是int是為了返回EOF(-1)
    • Windows—>Ctrl-Z
    • Unix—>Ctrl-D
標(biāo)準(zhǔn)庫(kù)中的字符串函數(shù)string.h

strlen
size_t strlen(const char * s);
返回s的字符串?度(不包括結(jié)尾的0)

char line[]="Hello"
printf("strlen=%lu\n",strlen(line));
printf("sizeof=%lu\n",sizeof(line));
輸出結(jié)果為:
strlen=5
sizeof=6

strcmp —compare

  • int strcmp(const char * s1, const char * s2);
  • ?較兩個(gè)字符串,返回:
  • 0:s1== s2
  • 0:s1>s2

  • <0:s1< s2
int mycmp(const char *s1,const char *s2)
{
	int idx = 0;
	while (s1[idx] == s2[idx] && s1[idx] != 0)
	{
		idx++;
	}return s1[idx] - s2[idx];
}
等同于
int mycmp(const char *s1,const char *s2)
{
	while (*s1==*s2&&*s1!='\0')
	{
		s1++; s2++;
	}
	return *s1 - *s2;
}

strcpy —copy

char * strcpy(char *restrict dst, const char *restrict src);
  • 把src的字符串拷?到dst
    • restrict表明src和dst不重疊(C99)
  • 返回dst
    • 為了能鏈起代碼來(lái)
      復(fù)制字符串
char *dst = (char*)malloc(strlen(src)+1);   //+1包括結(jié)尾最后的\0
strcpy(dst, src);

用函數(shù)等價(jià)

數(shù)組版本
char* mycpy(char*dst,const char* src)
{
int idx = 0;
while(src[idx]){
dst[idx]=src[idx];
idx++;
}
dst[idx]='\0';
return dst;
}
指針版本
char* mycpy(char*dst,const char* src)
{
char *ret=dst;
while( *dst++ = *src++ )
   ;
   *dst='\0';
   return ret;
}

strcat

char * strcat(char *restrict s1, const char *restrict s2);
  • 把s2拷?到s1的后?,接成?個(gè)?的字符串
  • 返回s1
  • s1必須具有?夠的空間
char?*mycat(char?cat1[],const?char?cat2[])?//聲明并實(shí)現(xiàn)我的貓字符指針函數(shù)。
{ ????int?i?=?0; ????
       int?j?=?strlen(cat1);?????????//貓1字符數(shù)組的最后一位下標(biāo)j ????while(i?!=?strlen(cat2)){???????????//當(dāng)貓2的下標(biāo)為最后一位\0時(shí)跳出循環(huán) ????????cat1[j]?=?cat2[i];???????   ??//貓1最后一位為貓二的第一位字符 ??????
       ??i++; ??????
       ??j++; ????
    } ????
    cat1[j]?=?'\0';???????????//貓1字符數(shù)組最后一位為0 ???
    ?return?cat1;????//讓我的貓字符指針指向貓1字符數(shù)組
}???????

安全問(wèn)題
strcpy和strcat都可能出現(xiàn)安全問(wèn)題:如果那個(gè)dst或者要連接的地方?jīng)]有足夠的空間,不知道是否越界
安全版本

char * strncpy(char *restrict dst, const char *restrict src, size_t n);
char * strncat(char *restrict s1, const char *restrict s2, size_t n);
int strncmp(const char *s1, const char *s2, size_t n);

在名字中間和參數(shù)表中多了一個(gè)n
n的意思是說(shuō)你能拷過(guò)去多少個(gè)字符;多了的部分直接掐掉,不會(huì)越界。
對(duì)于cmp來(lái)說(shuō)是比較前n個(gè)的大小

strchr
在參數(shù)?str?所指向的字符串中搜索第一次出現(xiàn)字符?c(一個(gè)無(wú)符號(hào)字符)的位置。

#include#includeint main ()
{
   const char str[] = "http://www.nowcoder.com";
   const char ch = '.';
   char *ret;
   ret = strchr(str, ch);
   printf("|%c| 之后的字符串是 - |%s|\n", ch, ret);
   return(0);
}
運(yùn)行結(jié)果為
|.| 之后的字符串是 - |.nowcoder.com|

strrchr
在參數(shù)?str?所指向的字符串中搜索最后一次出現(xiàn)字符?c(一個(gè)無(wú)符號(hào)字符)的位置。

#include#includeint main ()
{
   int len;
   const char str[] = "https://www.nowcoder.com";
   const char ch = '.';
   char *ret;
   ret = strrchr(str, ch);
   printf("|%c| 之后的字符串是 - |%s|\n", ch, ret);
   return(0);
}
運(yùn)行結(jié)果為
|.| 之后的字符串是 - |.com|

strstr()
在字符串?haystack?中查找第一次出現(xiàn)字符串?needle?的位置,不包含終止符 ‘\0’。
下面是 strstr() 函數(shù)的聲明。
char*strstr(constchar*haystack,constchar*needle)

#include

#include

intmain()

{
constcharhaystack[20] =?"NOWCODERABCD"; ???constcharneedle[10] =?“CODER”;
char *ret;
ret = strstr(haystack, needle);
printf("子字符串是: %s\n", ret);return(0);}`
輸出結(jié)果為
子字符串是: CODERABCD

memcpy

和strcpy類(lèi)似,只不過(guò)它是拷貝字節(jié)

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧


當(dāng)前標(biāo)題:C語(yǔ)言字符串+字符串函數(shù)-創(chuàng)新互聯(lián)
網(wǎng)站URL:http://weahome.cn/article/djceip.html

其他資訊

在線咨詢(xún)

微信咨詢(xún)

電話咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部