字符數(shù)組
char word[] = {‘H’, ‘e’, ‘l’, ‘l’, ‘o’,‘!’};
字符串
char word[] = {‘H’, ‘e’, ‘l’, ‘l’, ‘o’,‘!’,’ \0’};
字符串變量
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)存在的
唯?特殊的地?是字符串字?量可以?來(lái)初始化字符數(shù)組
以及標(biāo)準(zhǔn)庫(kù)提供了?系列字符串函數(shù)
char* s = "Hello, world!";
字符串賦值?
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ò)誤
這是?個(gè)空的字符串,buffer[0] == ‘\0’
char buffer[] = “”;
這個(gè)數(shù)組的?度只有1!
? 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ù)
putchar
getchar
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
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);
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);
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(const
char
*haystack,
const
char
*needle)
#include
#include
int
main()
{
const
char
haystack[20] =?"NOWCODERABCD"; ???
constchar
needle[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)查看詳情吧