還是要繼續學習,每天給自己打氣,
字符陣列
char word[] = {'H','e','l','l','o'};
這不是c語言的字串,不能用字串的方式做計算
一、字串
char word[] = {'H','e','l','l','o','\0'};
區別就是最后多了一個0,這就成為了字串
- 以0(整數0)結尾的一串字符
- 0或'\0'是一樣的,但和'0'不同
- 0標志字串的結束,但它不是字串的一部分
- 計算字串長度的時候不包含這個0
- 字串以陣列的形式存在,以陣列或者指標的形式訪問,更多的是以指標的形式
- string.h里有很多處理字串的函式
字串變數
char *str = "hello";
char word[] = "hello";
char line[10] = "hello";
字串常量
- “hello”
- “hello"會被編譯器變成一個字符陣列放在某處,這個陣列的長度是6,結尾還有表示結束的0
- 兩個相鄰的字串常量會被自動連接起來
字串
- c語言的字串是以字符陣列的形態存在的
- 不能用運算子對字串做運算
- 通過陣列的方式可以遍歷字串
- 唯一特殊的地方是字串字面量可以用來初始化字符陣列
二、字串常量
char *s = "hello world";
- s是一個指標,初始化為指向一個字串常量
- 由于這個常量所在的地方,所有實際上s是const char* s ,但是由于歷史的原因,編譯器接受不帶const的寫法
- 但試圖對s所指的字串做寫入會導致嚴重的后果
- 如果需要修改字串,應該用陣列
char s[] = "hello , world!";
指標還是陣列
char *str = "hello";
char word[] = "hello";
陣列:可以讀,可以寫
指標:只能讀,不能修改
如果要構造一個字串 ------>陣列
如果要處理一個字串 ------>指標
char*是字串
- 字串可以表達為char*的形式
- char*不一定是字串
- 本意是指向字串的指標,可能指向的是字符的陣列
- 只有它所指的字符陣列的結尾有0,才能說它所指的是字串
#include <stdio.h>
int main(void)
{
char *s = "hello world";
char *s1 = "hello world";
char s3[] = "hello world";
// 這個是不能修改的
// s[0] = 'B';
s3[0] = 'B';
printf("%p\n", s);
printf("%p\n", s1);
printf("%p\n", s3);
printf("Here! s[0]=%c\n", s[0]);
printf("Here! s3[0]=%c\n", s3[0]);
// 0000000000404000
// 0000000000404000
// 000000000062FE30
// Here! s[0]=h
// Here! s3[0]=B
return 0;
}
三、字串的輸入和輸出
字串賦值
char *t = 'title';
char *s;
s = t;
并沒有產生新的字串,只是讓指標s指向了t所指的字串,對s的任何操作就是對t做的
字串輸入和輸出
char string[8];
scanf("%s" , string);
printf("%s" , string);
scanf讀入一個單詞(到空格、tab、回車為止)
scanf是不安全的,因為不知道要讀入的內容的長度
常見錯誤
- char *string;
- scanf("%s" , string);
- 以為char*是字串型別,定義了一個字串型別的變數string就可以直接使用了
- 由于沒有對string初始化0 , 所以不一定每次運行都出錯
四、單字符輸入和輸出
int putchar(int c);
- 向標準輸出寫一個字符
- 回傳寫了幾個字符,EOF(-1)表示寫失敗
int getchar(void);
- 從標準輸入讀入一個字符
- 回傳型別是int是為了回傳EOF(-1) windows --->Ctrl-z
五、字串函式strlen
- size_t strlen(const char *s);
- 回傳s的字串長度(不包括結尾的0)
#include <stdio.h>
#include <string.h>
int main(int argc, char const *argv[])
{
char line[] = "hello";
printf("strlen=%lu\n", strlen(line));
printf("sizeof=%lu\n", sizeof(line));
return 0;
}
//strlen=5
// 這個包括了字串最后的0
//sizeof=6
當然了,也可以自己寫一個函式來計算字串長度
#include <stdio.h>
#include <string.h>
// 自定義方法來計算字串長度
int mylen(const char *s)
{
int idx = 0;
while ( s[idx] != '\0' ){
idx++;
}
return idx;
}
int main(int argc, char const *argv[])
{
char line[] = "hello";
printf("strlen=%lu\n", mylen(line));
printf("sizeof=%lu\n", sizeof(line));
return 0;
}
六、字串函式strcmp
- int strcmp(const char *s1 , const char *s2);
- 比較兩個字串回傳:
- 0:s1 == s2
- 1: s1 > s2
- -1: s1 < s2
七、字串函式strcpy
- char* strcpy(char *restrict dst , const char * restrict src);
- 把src的字串拷貝到dst
- restrict表明src和dst不重疊(c99)
- 回傳dst,為了能連起代碼來
復制一個字串
char *dst = (char*)malloc(Strlen(src)+1);
strcpy(dst , src);
八、字串strcat
- char* strcat(char *restrict s1 , const char *restrict s2);
- 把s2拷貝到s1的后面,接成一個長的字串
- 回傳s1
- s1必須具有足夠的空間
但是這些函式都是不安全的,因為你不知道有沒有足夠的空間,所以
安全版本:如圖

九、字串搜索函式
- char * strchr(const char *s , int c);
- char * strrchr(const chat *s int c);
- 回傳NULL表示沒有找到
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{
char s[] = "hello";
char *p = strchr(s, 'l');
// 找到第二個l
p = strchr(p+1,'l');
printf("%s\n", p);
return 0;
}
復制給另一個
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{
char s[] = "hello";
char *p = strchr(s, 'l');
char *t = (char*)malloc(strlen(p)+1);
strcpy(t,p);
printf("%s\n", t);
free(t);
// llo
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/71572.html
標籤:C
上一篇:資料結構--排序
