如何在c中使用substring函数?

时间:2012-05-10 08:20:34

标签: c substring

我有一个字符串,我希望它的子字符串从第五个位置到最后一个位置。我应该使用哪种功能?

7 个答案:

答案 0 :(得分:6)

如果您不使用原始字符串,则可以直接使用&s[4]。如果您需要副本,请执行

char new_str[STR_SIZE + 1] = {0};
strncpy(new_str, &s[4], STR_SIZE);

答案 1 :(得分:5)

您可以使用memcpy()头文件中的string.h函数。

memcpy()在内存块之间复制字节数据,有时称为缓冲区。此函数不关心被复制的数据类型 - 它只是进行精确的逐字节复制。函数原型是

void *memcpy(void *dest, void *src, size_t count);

参数dest和src分别指向目标和源内存块。 count指定要复制的字节数。返回值为dest。

如果两个内存块重叠,则该函数可能无法正常运行 - src中的某些数据可能会在复制之前被覆盖。使用下面讨论的memmove()函数来处理重叠的内存块。 memcpy()将在以下计划中展示。

您还可以在此处找到这些功能的示例:http://www.java-samples.com/showtutorial.php?tutorialid=591

答案 2 :(得分:1)

如果您也知道字符串中您想要获取子字符串的字符,那么您可以使用strstr函数。它定位子字符串。但是,如果您不知道要从哪里检索字符,那么您可以使用strcpy或strncpy来获取Eric提到的字符串。

答案 3 :(得分:1)

s+4

这提供了问题中要求的子字符串,而不是子字符串的副本。 's+4' 返回字符串 's' 第 5 个位置的子字符串。这是 C 语言中的一种高效的原始操作,并且不使用任何函数调用。

如果应用程序需要制作结果的本地副本,例如如果结果将被修改:

    char substring[strlen(s)-3] ;
    strcpy(substring, s+4) ;

请注意,这需要一个允许可变大小数组的现代 C 编译器。对于非本地副本,使用 malloc 分配子字符串(例如 char *substring = (char *)malloc(strlen(s)-3) ;),这适用于任何 C 编译器。

答案 4 :(得分:0)

如果我理解正确,你需要使用一些分隔符,以便分解子串中的字符串。例如“一#二#三”在一二三分手。如果是这样的话:

#include <stdio.h>
#include <string.h>
int main()
{
    char test[] = "one#two#three";
    char* res;
    res = strtok(test, "#");
    while(res) {
        printf("%s\n", res);
        res = strtok(NULL, "#");
    }

    return 0;
}

使用要标记的字符串调用strtok()一次。以下每个调用都应传递NULL,以便继续第一次调用的字符串。 另请注意,strtok可能会修改原始指针,因此如果它是动态分配的,则应在将其传递给strtok之前保存它。

答案 5 :(得分:0)

void substr(char *s, int a, int b, char *t) 
{
    strncpy(t, s+a, b);
}

最简单但有效的解决方案。声明一些t char变量以保存结果,然后只需将s作为要操作的字符串,将a作为初始偏移量,将b作为要提取的字符串的长度即可。

char t[255]="";
substr(s, a, b, t);

答案 6 :(得分:0)

与其告诉您如何提取子字符串(其他答案已经完成),我将解释为什么 C 没有没有标准的子字符串函数。

如果 C 确实有一个子字符串函数,它的声明可能看起来像这样:

char *substr(const char *instring, size_t pos, size_t len);

这将采用输入字符串 instring,从位置 len 开始提取长度为 pos 的子字符串,并将其作为新字符串返回。

但 64,000 美元的问题是,它如何返回新字符串

它可以为新字符串动态分配空间,但 C 的实用函数通常从不这样做。 (唯一能想到的例外是 strdup,它甚至不是标准的 C 函数。)

它可以在 instring 中插入一个 '\0' 字符,然后返回一个指向 instring 的指针,但这显然会修改 instring,这样的函数不应该这样做. (确实,这就是我推测此处假设的 substr 函数会接受 const char * 指针的原因。)

所以事实证明,在 C 中,实际上不可能编写一个合适的“实用”子字符串函数,它不进行任何动态内存分配,也不修改原始字符串。

所有这些都是 C 没有一流字符串类型这一事实的结果。

是否可以接受修改原始字符串是调用者的决定。如何为提取的子字符串分配内存是调用者的正确决定。因此,假设的 substr 函数几乎没有什么可做的了。这只是一些指针运算,将其封装在“substr”函数中可能会很好,但它最终并没有真​​正为调用者节省任何工作,因此在决定如何之后,调用者也可以自己进行指针运算它想处理那些更难的问题。

如果调用者愿意修改原始字符串,那么这样做很简单:

char instring[] = "marshmallow";
int pos = 3, len = 5;
instring[pos + len] = '\0';
char *substr = &instring[pos];
printf("%s\n", substr;

如果调用者想要分配单独的内存,无论是作为数组还是通过调用 malloc,这也非常简单:

char *substr = malloc(len + 1);
strncpy(substr, &instring[pos], len);
substr[len] = '0';

因此,如果 C 具有一流的字符串类型,那么它的标准库中肯定会有一个 substr 函数——但由于它没有,所以它没有。 (相比之下,C++确实有一个一流的 string 类型,并且它有一个 substr 方法与之配套。)