C++中的string与char*对比分析

4星 · 超过85%的资源 需积分: 10 13 下载量 179 浏览量 更新于2024-10-24 收藏 58KB DOC 举报
"string和char*在C++编程中的区别与联系" 在C++编程中,字符串处理是非常常见的一环,而`string`和`char*`则是两种主要的字符串表示方式。它们各自有不同的特性和使用场景,理解它们的区别和联系对于编写高效、安全的代码至关重要。 1. **类型定义与标准** - `string`:全称为`std::string`,是C++标准库中的一个模板类,属于STL(Standard Template Library)的一部分,提供了丰富的字符串操作方法。 - `char*`:是C语言中经典的字符串表示,它实际上是一个指向字符数组的指针,通常以`\0`作为字符串结束标识。 2. **构造与初始化** - `string`支持多种方式初始化,可以接受`char*`、`const char*`、另一个`string`实例,甚至另一个`string`的子串。例如:`string str = "example";` - `CString`(在MFC和ATL中使用)提供了更多类型的支持,如`char`、`wchar_t`和`TCHAR`,但其构造不如`string`灵活。 - `char*`没有构造函数,通常需要通过动态分配内存或直接赋值初始化,但需要注意防止悬挂指针和内存泄漏。 3. **赋值操作** - `string`支持广泛的赋值操作,可以直接赋值其他`string`、`char*`等。例如:`str = "another example";` - `CString`可以接受基本的字符串变量赋值,包括`char*`,但不如`string`灵活。 - `char*`只能通过指针赋值,且可能涉及内存安全问题,推荐使用`strcpy`或`memcpy`,并确保指针非空以防止悬挂指针。 4. **运算符重载** - `string`和`CString`都支持`operator=`,使得赋值简单易行,但`string`的赋值更加广泛和安全。 - 对于`operator+`,`string`和`CString`可以直接与其他`string`或`char*`相加,但两者之间不能直接用`+`操作符连接,需要转换类型。 - `char*`没有`+`运算符,如果需要拼接,通常使用`strcat`函数,但这涉及到内存管理和字符数组的大小计算,需要额外注意。 5. **安全性与内存管理** - `string`自动管理内存,不易出现内存泄漏,使用更安全。 - `char*`需要程序员手动管理内存,可能导致内存泄漏或越界访问,使用时需谨慎。 6. **其他操作** - `string`和`CString`提供了许多内置方法,如查找、替换、截取等,而`char*`需要依赖C库函数,如`strlen`、`strstr`等。 7. **选择与应用场景** - 对于现代C++编程,`string`通常更推荐,因为它提供更好的类型安全性和内存管理。 - 在兼容旧代码或MFC/ATL项目中,`CString`可能是首选。 - `char*`在某些特定场景下,如低级系统编程或需要直接控制内存时仍会被使用。 总结来说,`string`、`char*`和`CString`各有优劣,选择使用哪种取决于具体需求和项目环境。理解它们之间的差异,能够帮助我们更有效地进行字符串处理,避免潜在的问题。

将下面代码优化一下, 只要一个函数 最终输出新的json字符串指针#include <stdio.h> #include <stdlib.h> #include <string.h> #include <openssl/hmac.h> #include "cJSON.h" char *sortJsonString(cJSON *json); char *getSign(char *jsonString, char *key); char *addSignToJson(char *jsonString, char *key, char *signKey); char *sortJsonString(cJSON *json) { int count = cJSON_GetArraySize(json); char **keys = (char **) malloc(count * sizeof(char *)); int i = 0; cJSON_ArrayForEach(json, json) { keys[i++] = strdup(json->string); } qsort(keys, count, sizeof(char *), strcmp); char *sortString = (char *) malloc(1); sortString[0] = '\0'; for (int i = 0; i < count; i++) { cJSON *item = cJSON_GetObjectItemCaseSensitive(json, keys[i]); if (item->type == cJSON_Object) { char *subSortString = sortJsonString(item); sortString = (char *) realloc(sortString, strlen(sortString) + strlen(keys[i]) + strlen(subSortString) + 3); sprintf(sortString + strlen(sortString), "%s=%s&", keys[i], subSortString); free(subSortString); } else { sortString = (char *) realloc(sortString, strlen(sortString) + strlen(keys[i]) + strlen(item->valuestring) + 3); sprintf(sortString + strlen(sortString), "%s=%s&", keys[i], item->valuestring); } } sortString[strlen(sortString) - 1] = '\0'; cJSON_ArrayForEach(json, json) { free(keys[--i]); } free(keys); return sortString; } char *getSign(char *jsonString, char *key) { char *sortString = sortJsonString(cJSON_Parse(jsonString)); unsigned char *hmac = HMAC(EVP_sha256(), key, strlen(key), (const unsigned char *) sortString, strlen(sortString), NULL, NULL); char *sign = (char *) malloc(65); for (int i = 0; i < 32; i++) { sprintf(&sign[i * 2], "%02x", hmac[i]); } sign[64] = '\0'; free(sortString); return sign; } char *addSignToJson(char *jsonString, char *key, char *signKey) { char *sign = getSign(jsonString, key); cJSON *json = cJSON_Parse(jsonString); cJSON_AddStringToObject(json, signKey, sign); char *result = cJSON_Print(json); free(sign); cJSON_Delete(json); return result; }

2023-05-30 上传