在下列文字中會使用如下函數(shù)
printf()//打印
sizeof(獲取大小的對象)//獲取大小
atoi(要轉(zhuǎn)換成int的對象) //字符串轉(zhuǎn)換
strtod(將字符串轉(zhuǎn)換成浮點(diǎn)數(shù))
strcmp(字1卡骂,字2)//字符串比較
strstr(包含對象测秸,包含字段)//包含
strlen(字符串)//檢測字符串長度
strcpy(cpy, str);// str 會 copy 到 cpy 里面
strcat(cpy, str);//拼接
substr(str,0,5);//截取 長度0-5的字符
tolower(ch)//大寫轉(zhuǎn)小寫
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
1.字符串定義
void main(){
// 第一種 字符串?dāng)?shù)組
char str[] = {'D','a','r','r','e','n','\0'};
str[2] = 'y';
printf("%s\n",str);// 字符串結(jié)尾是 '\0'
// 第二種
char *str1 = "Darren";
str1[2] = 'y';
printf("%s", str1);
// 區(qū)別肥卡,一個(gè)能修改一個(gè)不能修改
getchar();
}
2.長度獲取方法?sizeof
int strlen_(char *str){
// 怎么獲取字符串的長度隐孽? 不斷讀取字符臼婆,判斷末尾 '\0'
int len = 0;
while (*str != '\0')
{
len++;
str++;
}
return len;
}
// 字符串長度獲取
void main(){
char *name = "Darren is";
char str[] = { 'D', 'a', 'r', 'r', 'e', 'n', '\0','i','s' };
// 怎么獲取長度丁频?有一種方式計(jì)算(不好使)
// printf("length is %d",sizeof(str)/sizeof(char));
printf("name length is %d\n", strlen(str));
// 自己來寫一個(gè)方法讀取字符串的長度
// strlen_(name);
printf("name length is %d", strlen_(str));
getchar();
}
3 字符串的轉(zhuǎn)換
1.int/float to string/array:
C語言提供了幾個(gè)標(biāo)準(zhǔn)庫函數(shù)按声,可以將任意類型(整型裹粤、長整型终蒂、浮點(diǎn)型等)的數(shù)字轉(zhuǎn)換為字符串,下面列舉了各函數(shù)的方法及其說明遥诉。
● itoa():將整型值轉(zhuǎn)換為字符串拇泣。
● ltoa():將長整型值轉(zhuǎn)換為字符串。
● ultoa():將無符號長整型值轉(zhuǎn)換為字符串矮锈。
● gcvt():將浮點(diǎn)型數(shù)轉(zhuǎn)換為字符串霉翔,取四舍五入。
● ecvt():將雙精度浮點(diǎn)型值轉(zhuǎn)換為字符串苞笨,轉(zhuǎn)換結(jié)果中不包含十進(jìn)制小數(shù)點(diǎn)债朵。
● fcvt():指定位數(shù)為轉(zhuǎn)換精度子眶,其余同ecvt()。
除此外葱弟,還可以使用sprintf系列函數(shù)把數(shù)字轉(zhuǎn)換成字符串壹店,其比itoa()系列函數(shù)運(yùn)行速度慢
2. string/array to int/float
C/C++語言提供了幾個(gè)標(biāo)準(zhǔn)庫函數(shù),可以將字符串轉(zhuǎn)換為任意類型(整型芝加、長整型硅卢、浮點(diǎn)型等)。
● atof():將字符串轉(zhuǎn)換為雙精度浮點(diǎn)型值藏杖。
● atoi():將字符串轉(zhuǎn)換為整型值将塑。
● atol():將字符串轉(zhuǎn)換為長整型值。
● strtod():將字符串轉(zhuǎn)換為雙精度浮點(diǎn)型值蝌麸,并報(bào)告不能被轉(zhuǎn)換的所有剩余數(shù)字点寥。
● strtol():將字符串轉(zhuǎn)換為長整值,并報(bào)告不能被轉(zhuǎn)換的所有剩余數(shù)字来吩。
● strtoul():將字符串轉(zhuǎn)換為無符號長整型值敢辩,并報(bào)告不能被轉(zhuǎn)換的所有剩余數(shù)字。
void main(){
// char * num = "1"; -> int float double
// char *num_str = "12.0xxx";
// int number = atoi(num_str);// 如果不能轉(zhuǎn)換就是 0 弟疆,后面如果有其他不是數(shù)字的就會被剔除 12xxx -> 12
// char *num_str = "12.5f";
// float number = atof(num_str);// 如果不能轉(zhuǎn)換返回的是默認(rèn)值 0.000000
char *num_str = "12.5xx";
double number = strtod(num_str, NULL);
printf("number is %lf",number);
getchar();
}
4字符串的比較?strcmp
C/C++函數(shù)戚长,比較兩個(gè)字符串
設(shè)這兩個(gè)字符串為str1,str2怠苔,
若str1=str2同廉,則返回零;
若str1<str2柑司,則返回負(fù)數(shù)迫肖;
若str1>str2,則返回正數(shù)攒驰。
matlab中函數(shù)蟆湖,strcmp(s1,s2) 判斷兩個(gè)字符串s1和s2是否相同玻粪,相同返回true ,不同返回false
void main(){
char* str1 = "Darren is";
char* str2 = "darren";
// 大于小于等于
// int rc = strcmp(str1, str2);// 區(qū)分大小寫比較
// int rc = _strcmpi(str1, str2);// c strcmpi c++ _strcmpi , andrroid ndk strcasecmp
// 比較前幾個(gè)
// int rc = strncmp(str1, str2,7);// count 代表的是比較字符串前幾個(gè)是否相等
int rc = _strnicmp(str1, str2, 6);
if (rc == 0){
printf("相等");
}
else{
printf("不相等");
}
getchar();
}
5 字符串查找隅津,包含?strstr
包含文件:string.h
函數(shù)名: strstr
函數(shù)原型:
1externchar*strstr(char*str1,?constchar*str2);
語法:
1*?strstr(str1,str2)
str1: 被查找目標(biāo) string expression to search.
str2: 要查找對象 The string expression to find.
返回值:若str2是str1的子串,則返回str2在str1的首次出現(xiàn)的地址奶段;如果str2不是str1的子串,則返回NULL剥纷。
void main(){
char* str = "name is Darren";
char *substr = "not";
char* pos = strstr(str, substr);// 返回的是字符串第一次出現(xiàn)的位置(位置指針), 如果沒有找到返回的是空
// 求一下位置 int 怎么辦痹籍? strstr
// int postion = pos - str;
// printf("第一次出現(xiàn)的位置是:%d\n",postion);
// 包含?pos 是不是空就可以了
if (pos){
printf("%s", "包含");
}
else{
printf("%s", "不包含");
}
getchar();
}
6 拼接晦鞋,截取蹲缠,大小寫轉(zhuǎn)換
void main(){
// strcpy(); copy進(jìn)來
char* str = "darren";
char *str1 = " is";
// char* str1 = "is";
int len = strlen(str);// cpy[len] android studio 是可以的
char cpy[20];
// str 會 copy 到 cpy 里面
strcpy(cpy, str);
printf("%s\n",cpy);
// 拼接
strcat(cpy,str1);
printf("%s", cpy);
getchar();
}
char * substr(char * str,int start,int end){
// 開辟一個(gè)字符串去存儲我們的數(shù)據(jù)棺克,開辟多大計(jì)算
// char sub[end-start];
int len = end - start;
char* sub = (char*)malloc(len*sizeof(char)+1);// 記得加上1 ,在 NDK 一般會采用靜態(tài)的數(shù)組存儲 char sub[len]
// malloc 一定要 free
// 遍歷賦值
str += start;
for (int i = 0; i < len; i++)
{
sub[i] = *str;
str++;// 指針往后邏一位
}
// 標(biāo)記字符串結(jié)尾线定,否則 print 無法判斷結(jié)尾
sub[len] = '\0';
printf("%p\n",sub);
// free(sub);
return sub;
}
7 字符串的截取?substr
void main(){
char *str = "Darren is";
// 截取第三個(gè)位置到第五個(gè)位置 3娜谊,5
char *sub = substr(str,0,5);
printf("%p\n", sub);
printf("%s",sub);
// 一定要 free ,因?yàn)槟愕?substr 有動(dòng)態(tài)開辟內(nèi)存斤讥,但是真正開發(fā)過程中并不會這么做纱皆,自己的方法盡量要自己處理好內(nèi)存
free(sub);
getchar();
}
// dest 用來存放結(jié)果,大小自己指定
// source 需要轉(zhuǎn)換的字符串
void lower(char* dest,char* source){
while (*source != '\0'){
// 拿當(dāng)前字符
char ch = *source;
// 轉(zhuǎn)完賦值給 dest
*dest = tolower(ch);// a -> a A -> a
// 接著指針 ++ 芭商,遍歷下一個(gè)
source++;
dest++;
}
// 標(biāo)記字符串結(jié)尾
*dest = '\0';
}
8 大小寫轉(zhuǎn)換 lower
void main(){
char* name = "daRRen";
char dest[20];
lower(dest,name);
printf("%s",dest);
getchar();
}
*/