字符串
1.字符串声明
-
字面量
定义字面量时通常将其分配在字面量池中, 通常只有一个副本. 关闭字面量池, 可以生成多个副本
//通常将字面量看作常量,不做修改
char *tabHeader = "Media Player";
-
数组
char header[] = "Media Player";
-
指针
char *header = (char*) malloc(strlen("Media Player")+1); strcpy(header,"Media Player"); //使用malloc函数的注意事项: //1. 一定要加上结束符NUL,即'/0' //2. 不要用sizeof操作符,而是用strlen函数来确定已有字符串的长度。sizeof操作符会返回数组和指针的长度,而不是字符串的长度
char *prefix = '+';//不合法
//字面量是int类型,这其实是在尝试把整数赋值给字符指针
2.字符操作
-
strcmp函数
//函数原型 int strcmp(const char *s1, const char *s2); //按字典序,s1 < s2,返回负数;s1 = s2,返回0;s1 > s2,返回正数 //字符串比较不正确的做法 //1. 赋值符号= char command[16]; printf("Enter a Command: "); scanf("%s",command); if(command = "Quit") { //将字面量地址赋值给数组 } //2. 相等操作符== if(command == "Quit") { //比较的是地址 }
-
strcpy函数
//函数原型 char* strcpy(char *s1, const char *s2); //一类常见的应用程序会读入一系列字符串,挨个存入占据最少内存的数组 char name[32];//用于读入字符串 char *names[30]; size_t count = 0; printf("Enter a name: "); scanf("%s",name); names[count] = (char*)malloc(strlen(name)+1);//动态分配内存给每个字符串 strcpy(names[count],name); count++;
-
strcat函数
//函数原型 char *strcat(char *s1, const char *s2); //一定要专门为拼接字符串分配内存,防止发生内存泄漏 char* error = "ERROR: "; char* errorMessage = "Not enough memory"; char* buffer = (char*)malloc(strlen(error)+strlen(errorMessage)+1); strcpy(buffer,error); strcat(buffer, errorMessage) //不正确的拼接 char error[]="ERROR:"; char errorMessage[]="Not enough memory"; strcat(error,errorMessage);//不合法,覆写栈帧的一部分
error = strcat(error,errorMessage);//不合法,将指针赋值给数组名字
//字符字面量和字符串字面量
char* path="C:";
char* currentPath=(char*)malloc(strlen(path)+2);
currentPath=strcat(currentPath,"\\");//转义字符,拼接了一个反斜杠
currentPath=strcat(currentPath,'\\');//int整数转化为char类型变量的地址
```
3.传递在函数中初始化的字符串
//传递一个空缓存区让函数填充并返回
char* format(char *buffer, size_t size,
const char* name, size_t quantity, size_t weight) {
snprintf(buffer, size, "Item: %s Quantity: %u Weight: %u",
name, quantity, weight);
return buffer;
}
//函数动态分配缓存区
char* format(char *buffer, size_t size,
const char* name, size_t quantity, size_t weight) {
char *formatString = "Item: %s Quantity: %u Weight: %u";
size_t formatStringLength = strlen(formatString)-6;
size_t nameLength = strlen(name);
size_t length = formatStringLength + nameLength +
10 + 10 + 1;
if(buffer == NULL) {
buffer = (char*)malloc(length);
size = length;
}
snprintf(buffer, size, formatString, name, quantity, weight);
return buffer;
}
4.给应用程序传递参数
//对基于命令行的程序来说,通过为其传递信息来打开某种行为的开关或控制某种行为很常见
//C用传统的argc和argv参数支持命令行参数。
//第一个参数argc,是一个指定传递的参数数量的整数。系统至少会传递一个参数,这个参数是可执行文件的名字。
//第二个参数argv,通常被看做字符串指针的一维数组,每个指针引用一个命令行参数
int main(int argc, char** argv) {
for(int i=0; i<argc; i++) {
printf("argv[%d] %s\n",i,argv[i]);
}
...
}
//下列命令执行程序
process.exe -f names.txt limit=12 -verbose
//输出
argv[0] c:/process.exe
argv[1] -f
argv[2] names.txt
argv[3] limit=12
argv[4] -verbose
网友评论