gpt4 book ai didi

c - C语言中的拆分和连接字符串

转载 作者:太空狗 更新时间:2023-10-29 15:51:15 25 4
gpt4 key购买 nike

我在大学学过 C,但已经好几年没用过了。最近我开始研究一个使用 C 作为编程语言的工具。现在我坚持使用一些非常基本的功能。其中包括如何使用定界符拆分和连接字符串? (我非常想念 Python,甚至想念 Java 或 C#!)

下面是我创建的用于拆分字符串的函数,但它似乎无法正常工作。此外,即使此功能有效,分隔符也只能是单个字符。如何使用字符串作为分隔符?

有人可以提供一些帮助吗?

理想情况下,我希望有两个功能:

//  Split a string into a string array
char** fSplitStr(char *str, const char *delimiter);

// Join the elements of a string array to a single string
char* fJoinStr(char **str, const char *delimiter);

谢谢,

艾伦

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

char** fSplitStr(char *str, const char *delimiters)
{
char * token;
char **tokenArray;
int count=0;
token = (char *)strtok(str, delimiters); // Get the first token
tokenArray = (char**)malloc(1 * sizeof(char*));

if (!token) {
return tokenArray;
}

while (token != NULL ) { // While valid tokens are returned
tokenArray[count] = (char*)malloc(sizeof(token));
tokenArray[count] = token;
printf ("%s", tokenArray[count]);
count++;
tokenArray = (char **)realloc(tokenArray, sizeof(char *) * count);
token = (char *)strtok(NULL, delimiters); // Get the next token
}
return tokenArray;
}

int main (void)
{
char str[] = "Split_The_String";
char ** splitArray = fSplitStr(str,"_");
printf ("%s", splitArray[0]);
printf ("%s", splitArray[1]);
printf ("%s", splitArray[2]);
return 0;
}

答案:(感谢 Moshbear、Joachim 和 sarnold):

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

char** fStrSplit(char *str, const char *delimiters)
{
char * token;
char **tokenArray;
int count=0;
token = (char *)strtok(str, delimiters); // Get the first token
tokenArray = (char**)malloc(1 * sizeof(char*));
tokenArray[0] = NULL;
if (!token) {
return tokenArray;
}
while (token != NULL) { // While valid tokens are returned
tokenArray[count] = (char*)strdup(token);
//printf ("%s", tokenArray[count]);
count++;
tokenArray = (char **)realloc(tokenArray, sizeof(char *) * (count + 1));
token = (char *)strtok(NULL, delimiters); // Get the next token
}
tokenArray[count] = NULL; /* Terminate the array */
return tokenArray;
}

char* fStrJoin(char **str, const char *delimiters)
{
char *joinedStr;
int i = 1;
joinedStr = realloc(NULL, strlen(str[0])+1);
strcpy(joinedStr, str[0]);
if (str[0] == NULL){
return joinedStr;
}
while (str[i] !=NULL){
joinedStr = (char*)realloc(joinedStr, strlen(joinedStr) + strlen(str[i]) + strlen(delimiters) + 1);
strcat(joinedStr, delimiters);
strcat(joinedStr, str[i]);
i++;
}
return joinedStr;
}


int main (void)
{
char str[] = "Split_The_String";
char ** splitArray = (char **)fStrSplit(str,"_");
char * joinedStr;
int i=0;
while (splitArray[i]!=NULL) {
printf ("%s", splitArray[i]);
i++;
}
joinedStr = fStrJoin(splitArray, "-");
printf ("%s", joinedStr);
return 0;
}

最佳答案

使用strpbrk而不是strtok,因为strtok有两个弱点:

  • 它不是可重入的(即线程安全的)
  • 修改字符串

对于连接,使用strncat 进行连接,使用realloc 调整大小。操作顺序非常重要。

在执行realloc;strncat循环之前,将目标字符串的第0个元素设置为'\0',这样strncat就不会'不会导致未定义的行为。

关于c - C语言中的拆分和连接字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8118269/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com