今天工作中需要让C语言来解析这个字串“print,scan,setting”的内容。
且字串的长度和内容的数量预先都不知道,唯一知道的信息就是内容是被逗号所分割。
我给嵌入式工程师丢脸了。我尝试着去写了一遍,没能成功。最后我用chatgpt帮我写了一遍,不得不说,真牛🐂!!!
虽然说,使用GPT写的,我们也要学习其中的逻辑融会贯通。
下面我们就来一起解析以下GPT写的代码,让我们看看GPT到底牛在哪
ChatGPT给我的回复
废话不多说,直接上代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
// 给定的字符串
char inputString[] = "print,scan,setting";
// 存储提取内容的动态数组
char **extractedArray = NULL;
int arraySize = 0;
// 使用strtok按逗号分割字符串
char *token = strtok(inputString, ",");
// 逐个提取子串并动态添加到数组
while (token != NULL) {
// 动态分配内存保存当前子串
char *currentSubstring = strdup(token);
// 动态扩展数组
extractedArray = realloc(extractedArray, (arraySize + 1) * sizeof(char *));
extractedArray[arraySize] = currentSubstring;
arraySize++;
token = strtok(NULL, ",");
}
// 打印存储在数组中的内容
for (int i = 0; i < arraySize; i++) {
printf("提取的内容[%d]: %s\n", i, extractedArray[i]);
}
// 释放动态分配的内存
for (int i = 0; i < arraySize; i++) {
free(extractedArray[i]);
}
free(extractedArray);
return 0;
}
首先用的是二级指针来保存字串中的内容,这里的二级指针可以理解为指针的数组自我感觉比较好记。并且用arraySize来记录数组的成员的数量。
// 存储提取内容的动态数组
char **extractedArray = NULL;
int arraySize = 0;
在用strtoken函数来拆分字串中的内容。
这里大概一下,strtoken函数原型如下
char *strtok(char *str, const char *delim)
str—要被分解的字符串,delim—用作分隔符的字符(可以是一个,也可以是集合)
可以理解为在str搜寻delim,并以delim为分隔符来分割字串str。
利用这个函数直接按照逗号来分割字串,并返回字串的首地址。
这个函数用的太漂亮了,佩服。
// 使用strtok按逗号分割字符串
char *token = strtok(inputString, ",");
将第一个拆分的字串保存在临时指针currentSubstring中,再利用realloc动态扩展提取内容数据空间,再将临时指针的内容赋值给指针数组。随后再次获取下一个字串中的内容,直到遍历到字串的末尾‘\0’为之。
realloc函数的作用为动态分配,可以给已经分配完空间的指针,重新分配指针的空间大小
我理解,这里的作用在于不停的给指针数组扩容,直到没有内容为之
strdupy也是个考点,详情可以参考我另一篇文章https://editor.csdn.net/md/?articleId=135208320
// 逐个提取子串并动态添加到数组
while (token != NULL) {
// 动态分配内存保存当前子串
char *currentSubstring = strdup(token);
// 动态扩展数组
extractedArray = realloc(extractedArray, (arraySize + 1) * sizeof(char *));
extractedArray[arraySize] = currentSubstring;
arraySize++;
token = strtok(NULL, ",");
}
这里就是循环打印log了
// 打印存储在数组中的内容
for (int i = 0; i < arraySize; i++) {
printf("提取的内容[%d]: %s\n", i, extractedArray[i]);
}
申请空间了,别忘记循环释放。
// 释放动态分配的内存
for (int i = 0; i < arraySize; i++) {
free(extractedArray[i]);
}
free(extractedArray);
return 0;
这里用到了不少生僻的函数strtok、strdup、realloc。
不得不说GPT的知识储备量真惊人呀,如果我自己的写的话,两天不知道还能不能搞定。
确实有值得我们学习的地方,但也不能完全依靠它,吃一堑长一智。
下次我们面对这种情况就有办法应对了。
到这就结束了,如果觉着还不错可以留一个小心心,作者接着分享工作中遇到的有趣的困难。