1.字符串
表現形式:char ch[5]={'a','b','c','d','e'};
注意點:
雙引號括起來
每個字符佔用一個字節
以'\0'表示字符串結束
int main(int argc, const char * argv[])
{
char str[100]="hahahaha\0wewewe\0helloworld";
printf("%s\n",str);
printf("%s\n",&str[9]);
printf("%s\n",&str[16]);
return 0;
}
1.1字符串長度
注意點:
字符串有效長度不包含'\0'
sizeof 是一個運算符, 求變量或者常量佔用內存空間大小
strlen是一個函數, 求字符串有效字符個數
int mystrlen(const char * src)
{
int i=0;
while (src[i]!='\0') {
i++;
}
return i;
}
int main(int argc, const char *argv[])
{
char str[100]="hello world";
printf("%d \n", mystrlen(str));//調用函數求出長度
printf("%ld \n", sizeof(str));
printf("%ld \n", sizeof("hello world"));
printf("str == %ld \n", strlen(str));
return 0;
}
1.2字符串拷貝(複製)
函數:
strcpy:
char *strcpy(char *, const char *);
strncpy:
char *strncpy(char *, const char *, size_t);
注意點:
s1的內存空間足夠容納s2字符串
strncpy 選擇拷貝的字節數, 不一定包含'\0';
//自定義拷貝函數
char *mystrcpy(char *dst, const char *src)
{
int i =0;
while (src[i]) {
dst[i]=src[i];
i++;
}
dst[i]='\0';
return dst;
}
int main(int argc, const char *argv[])
{
char s1[100];
char s2[50]="hello world\n";
//char *str = strcpy(s1, s2);
//printf("%s\n",strcpy(s1, s2));
//printf("%s\n",str);
//printf("%s\n",mystrcpy(s1, s2));
strncpy(s1, s2, 10);
s1[10]='\0';
printf("%s\n", s1);
return 0;
}
1.3字符串拼接
函數:
strcat:
char *strcat(char *, const char *);
strncat:
char *strncat(char *, const char *, size_t);
strncat在拼接後的新字符串後會添加一個'\0';
//自定義拼接函數
char *mystrcat(char *s1, const char *s2)
{
int i=0,j;
while (s1[i]) {
i++;
}
//循環拼接操作
for (j=0; s2[j]!='\0'; j++) {
s1[i+j]=s2[j];
}
s1[i+j]='\0';
return s1;
}
int main(int argc, const char *argv[])
{
char s1[100]="hello world";
char s2[50]="wearefriend";
//printf("%s\n",strcat(s1, s2));
//printf("%s\n",mystrcat(s1, s2));
printf("%s\n",strncat(s1, s2, 5));
return 0;
}
1.4字符串比較函數
函數:
strcmp:
int strcmp(const char *, const char *);
strncmp:
int strncmp(const char *, const char *, size_t);
s1 > s2 返回一個正數
s1 == s2 返回0
s1 < s2 返回一個負數
//自定義比較函數
int mystrcmp(const char* s1, const char *s2)
{
int i;
//循環判斷到字符串結尾處
for (i=0; (s1[i]!='\0')&&(s2[i]!='\0') ; i++) {
if (s1[i]==s2[i]) {
continue;
}
else
{
break;
//return s1[i]-s2[i];
}
}
//返回一個比較數
return s1[i]-s2[i];
}
int main(int argc, const char *argv[])
{
char *str1 = "borld";
char *str2 = "zorld";
//printf("%d\n", mystrcmp(str1, str2));
printf("%d\n", strncmp(str1, str2, 7));
//char s1[30]="hello world";
return 0;
}
1.5字符串查找
函數:
strchr:
char *strchr(const char *, int);
strrchr:
char *strrchr(const char *, int);
char *mystrchr(const char *s1, char ch)
{
int i=0;
while (s1[i]) {
if (s1[i]==ch) {
break;
}
i++;
}
return (char *)&s1[i];
}
int main(int argc, const char *argv[])
{
char str[100]="hello world!";
char *pstr = mystrchr(str, 'l');
printf("%s\n", pstr);
//printf("%s\n", pstr);
return 0;
}
1.6查找字符串
函數:
strstr:
char *strstr(const char *, const char *);
int main(int argc, const char *argv[])
{
char str1[100]="helloworld helloworld";
printf("%p\n",&str1[strlen(str1)]);
// char *pstr = strstr(str1, "world");
// printf("%s\n", pstr);
char *p = str1;
while ((p=strstr(p, "world"))) {
if (p) {
printf("%s\n", p);
p+=sizeof("world")-1;
}
}
return 0;
}
1.7字符串分割
函數:
strtok:
char *strtok(char *, const char *);
int main(int argc, const char *argv[])
{
char str[100]="hello world:good-bye:://we^are..friend()ok///";
// char *p=strtok(str, ": ");
// printf("%s\n",p);
// while ((p=strtok(NULL, ": /^.()-"))) {
// printf("%s\n",p);
// }
char *p = str;
while ((p=strtok(p, ": /^.()-")))
{
printf("%s\n",p);
p=NULL;
}
// p = strtok(NULL, ":");
// printf("%s\n",p);
return 0;
}
eg.按照空格來分割字符串得到單詞數量(不使用系統函數)
int main(int argc, const char *argv[])
{
char str[200];
scanf("%[^\n]",str);
int i=0;
int flag=1;//標誌位
int cnt=0;//統計數量
while (str[i]!='\0') {
if (str[i]==' ') {
if (!flag) {
flag = 1;
}
}
else
{
if (flag) {
cnt++;
flag =0;
}
}
i++;
}
printf("%d\n", cnt);
return 0;
}