C指针(7):字符串

字符串

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

你可能感兴趣的:(C指针(7):字符串)