接續上篇[C語言基礎及指針⑤動態內存分配](http://www.jianshu.com/p/93db7c692d1b)
字符操作 , 是我們寫程序時 , 最常用的一種操作 , 例如:字符串截取 , 字符串替換 , 字符串轉整數類型等等 , 都是字符操作 , 在java中`String`類就是二三十個方法 , 還有`StringBuffer` , `StringBuilder`等輔助類 。 下面 ,我們就來看看C語言中字符處理的函數 。
### 一. 字符數組
```c
// 字符數組
void charArray() {
// 字符數組 , 可以修改
char c[15] = { 'y','e','s',' ','m','a','n' };
// 字符數組可以直接作為字符串輸出
printf("%s\n", c);
// 修改
c[0] = 'a';
printf("修改字符:%s\n", c);
}
```
字符數組 , 本身是一個數組 , 但是也可以作為字符串格式化輸出 , 可以任意替換里面的字符 , 和操作數組是一樣的 。
### 二. 字符指針
```c
/*字符指針*/
void charPointer() {
// 內存連續排列 , 不可修改
char* s = "Never give up";
printf("內存地址:%#x\n", s);
printf("-------------------------------\n截取字符\n");
// 截取字符
s += 6;
while (*s)
{
printf("%c", *s);
s++;
}
}
```
字符指針與字符數組 , 最大的區別是一個定義了就不可以修改 , 一個可以任意修改里面的字符 , 就和`String`和`StringBuilder`一樣 , String定義了就無法增加或修改里面的內容 , 一個是可以增加和修改里面的內容 。
下面就列舉幾個常用的操作:
> 字符函數查詢網站: [字符串函數](http://www.kuqin.com/clib/string/strpbrk.html)
### 拼接字符串
```c
/*拼接函數*/
void spliceString() {
// 合并后存儲字符的容器
char dest[40] = {'h','e','h','e',' '};
char* c1 = "Never give up ";
char* c2 = "I blive you ! ";
// 會清除字符數組原有的數據
//strcpy(dest, c1);
strcat(dest, c1);
strcat(dest, c2);
printf("\n拼接字符串:\n%s\n", dest);
}
```
### 查找單個字符
```c
/*查找單個字符*/
void searchChar() {
char* str = "I wanna dont kiss you";
char* p = strchr(str, 'd');
if (p) {
printf("索引位置:%d\n", p - str);
printf("打印: ");
str += p - str;
while (*str)
{
printf("%c",*str);
str++;
}
printf("\n");
}
else {
printf("沒有找到\n");
}
}
```
### 查找字符串
```c
/*查找字符串*/
void sreachChars() {
char* str = "落花有意流水無情";
char* handle = "流";
char* p = strstr(str, handle);
if (*p) {
printf("索引位置:%d\n", p - str);
printf("打印: ");
str += p - str;
printf("%s ---- %s\n", str,p);
}
else {
printf("沒找到\n");
}
}
```
### 字符轉換
```c
/*字符轉換int*/
void strToInt() {
char* p = "123";
int toInt = atoi(p);
int res = toInt + 123;
printf("字符轉換int數值: %d\n", res);
}
```
### 字符轉換函數定義:
```c
/-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
//
// Narrow String to Number Conversions
//
//-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
_Check_return_ _ACRTIMP double __cdecl atof (_In_z_ char const* _String);
_Check_return_ _CRT_JIT_INTRINSIC _ACRTIMP int __cdecl atoi (_In_z_ char const* _String);
_Check_return_ _ACRTIMP long __cdecl atol (_In_z_ char const* _String);
_Check_return_ _ACRTIMP long long __cdecl atoll (_In_z_ char const* _String);
_Check_return_ _ACRTIMP __int64 __cdecl _atoi64(_In_z_ char const* _String);
_Check_return_ _ACRTIMP double __cdecl _atof_l (_In_z_ char const* _String, _In_opt_ _locale_t _Locale);
_Check_return_ _ACRTIMP int __cdecl _atoi_l (_In_z_ char const* _String, _In_opt_ _locale_t _Locale);
_Check_return_ _ACRTIMP long __cdecl _atol_l (_In_z_ char const* _String, _In_opt_ _locale_t _Locale);
_Check_return_ _ACRTIMP long long __cdecl _atoll_l (_In_z_ char const* _String, _In_opt_ _locale_t _Locale);
_Check_return_ _ACRTIMP __int64 __cdecl _atoi64_l(_In_z_ char const* _String, _In_opt_ _locale_t _Locale);
_Check_return_ _ACRTIMP int __cdecl _atoflt (_Out_ _CRT_FLOAT* _Result, _In_z_ char const* _String);
_Check_return_ _ACRTIMP int __cdecl _atodbl (_Out_ _CRT_DOUBLE* _Result, _In_z_ char* _String);
_
```
C語言中的字符操作函數也比較多 , 這里列舉幾個常用的 , 其他的可以去[字符串函數](http://www.kuqin.com/clib/string/strpbrk.html)網址查詢 , 都有例子 。
Android程序員學C系列:
[C語言基礎及指針①](http://www.jianshu.com/p/4701cd1e1914)
[C語言基礎及指針②之指針內存分析](http://www.jianshu.com/p/d556070b12ef)
[C語言基礎及指針③函數與二級指針](http://www.jianshu.com/p/184df8a1f195)
[C語言基礎及指針④函數指針](http://www.jianshu.com/p/181b50e02c89)
[C語言基礎及指針⑤動態內存分配](http://www.jianshu.com/p/93db7c692d1b)
[C語言基礎及指針⑥字符操作](http://www.jianshu.com/p/b7e6fc094087)
[C語言基礎及指針⑦結構體與指針](http://www.jianshu.com/p/36cc18151e87)
- 簡介
- C語言基礎及指針①語法基礎
- C語言基礎及指針②之指針內存分析
- C語言基礎及指針③函數與二級指針
- C語言基礎及指針④函數指針
- C語言基礎及指針⑤動態內存分配
- C語言基礎及指針⑥字符操作
- C語言基礎及指針⑦結構體與指針
- C語言基礎及指針⑧文件IO
- C語言基礎及指針⑨聯合體與枚舉
- C語言基礎及指針⑩預編譯及jni.h分析
- JNI開發系列①JNI概念及開發流程
- JNI開發系列②.h頭文件分析
- JNI開發系列③C語言調用Java字段與方法
- JNI開發系列④C語言調用構造方法
- JNI開發系列⑤對象引用的處理
- NDK開發基礎①使用Android Studio編寫NDK
- NDK開發基礎②文件加密解密與分割合并
- NDK開發基礎③增量更新之服務器端生成差分包
- C++基礎①命名空間結構體和引用