2

我有一个字符指针,它指向一个字符串的开头和一个小于字符串长度的索引。现在我想创建一个指针,将原始字符串的子字符串从开头指向索引或具有上述约束的子字符串。请帮助我找到完成它的方法。这是一些代码:

char* ch="323+465";//this is the original string
int index=2;  //this is the index upto which I wish to create a substring, 
              // in java, it would have been ch.substring(0,3), if ch were a String

提前致谢。

4

5 回答 5

1

如果不创建 3 个字符串,您将无法做到这一点。字符点仅标记字符串的开头,因此您需要将指针和索引组合成一个新类型。请记住,您在 C 中没有字符串。在 Java(和其他)等语言中,无论如何都会创建子字符串的副本。

struct pseudo_string { char *s, int index; } vstring[3];
char* ch="323+465";
vstring[0].s = ch;
vstring[0].index = 2;
vstring[1].s = ch + index + 1;  // weird
vstring[1].index = 1;
vstring[2].s = vstring[1].s + 1;
vstring[2].index = 2;

所以它过于复杂和无用。在这种情况下,索引被用作计数器......

如果你想保持相同的基指针,你需要 2 个索引或 1 个索引和一个 len:

struct pseudo_string2 { char *s; int start; int end; };

但这对于小字符串来说是过度的。

如果不想使用 malloc,可以尝试使用矩阵:

char vstring[3][10]={0};
strncpy(vstring[0], ch, 3);
strncpy(vstring[1], ch+3, 1);
strncpy(vstring[2], ch+4, 3);

矩阵的优点是,即使浪费了几个字节,也不需要释放它。但是,如果您需要在此函数之外使用这些值,那么除了使用 malloc 和 free 之外,您别无其他选择(不要为此考虑全局变量 ;-)。

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

char * substr(char *s, int start, int end)
{
       int size = end - start + 2; // 1 for the inclusive limits and another 1 for the \0
       char * r = (char*)malloc(size);
       strncpy(r,s+start, size-1);
       r[size-1]=0;
       return r;
}
int main()
{
    char* ch="323+465";
    char *parts[3];
    parts[0] = substr(ch, 0,2);
    parts[1] = substr(ch, 3,3);
    parts[2] = substr(ch, 4,6);
    printf("%s %s %s\n", parts[0], parts[1], parts[2]);
    free(parts[0]);
    free(parts[1]);
    free(parts[2]);
}
于 2012-09-13T13:55:38.533 回答
0

复制适当数量的字符:

char * substr = malloc(index + 2);
strncpy(substr, ch, index + 1);
substr[index + 1] = 0;

// ...

free(substr);

如果您乐于破坏原始字符串,只需插入一个空字节:

ch[index + 1] = 0;

奇怪+ 1的是您的索引似乎是包容性的,这通常是一个坏主意

于 2012-09-13T12:38:52.840 回答
0

你不能,因为这意味着修改字符串文字,这是非法的。

选择:

char ch[]="323+465";
int index=2;
ch[index] = '\0'; 
于 2012-09-13T12:39:23.950 回答
0

首先,通过使用 char 数组而不是指向字符串文字的指针来使字符串可写。然后

char ch[] = "323+456";

int idx = 2;
ch[idx] = 0; /* Now ch holds the string "32" */

你应该避免标识符与经典的 BSDindex函数发生冲突,这就是我使用它的原因idx

此解决方案假定可以修改原始字符串。如果没有,您需要先分配一个新字符串。

于 2012-09-13T12:41:29.577 回答
0

java子字符串的相同行为(分配新字符串)

 char* res = (char*)malloc(index+2);
 strncpy(res,ch,index+1);
 res[index+1]='\0';

我看到您尝试用 + 分隔,所以使用 strtok 更容易:

 char ch[] ="323+465";
 char * res;
 res = strtok (ch,"+");
 // res= 323
于 2012-09-13T12:41:53.323 回答