我有一个字符串,我希望它的子字符串从第五个位置到最后一个位置。我应该使用哪种功能?
答案 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
方法与之配套。)