C++中char[]的子串

9

I have

  char t[200];
  cin.get(s, 200);
  int i = 5; 
  int j = 10;

除了将每个元素单独复制到另一个数组中以外,是否有任何简单的方法从t获取substriing(i,j)?不使用strings等,只使用char t [200]


6
这个表述太模糊了。用在什么地方?你可以将索引(起始位置和结束位置)与“t”一起传递给需要子字符串的函数。 - Synxis
2
问题在于标准的 C "字符串" 是以 null 结尾的。这意味着,如果您例如从第5到10个字符中获取一个子字符串,您不仅必须有第5个字符的地址(易于实现),而且还必须在第10个字符后面放置一个 null。这将“践踏”原始数组。因此,要做一个“正确”的工作,必须复制该字符串。(但如果其余的数组是“可抛弃”的,则可以从原始缓冲区工作。)(当然还需要考虑范围问题--char 数组(而不是指针)仅存在于声明它的方法中。) - Hot Licks
6个回答

7
如果您被允许修改 t,则可以将 t[j] 设置为 0,然后使用 t + i 来获取子字符串。
如果不行,您就必须要复制一份。
话虽如此,为什么不能直接使用 std::string,并避免麻烦呢?

6
char* substr(char* arr, int begin, int len)
{
    char* res = new char[len + 1];
    for (int i = 0; i < len; i++)
        res[i] = *(arr + begin + i);
    res[len] = 0;
    return res;
}

1
除了已经提供的代码外,您能否提供更多关于您答案的细节? - Andrew Lively
谢谢!我不知道我必须在末尾加0,我总是在打印复制的数组时得到奇怪的结果! - IngeniousTom

4
如果你只需要读取数据,那么t+i就是你想要的,但不幸的是,你需要管理你子字符串的长度...
char *sub = t+i;
int len = j-i;
printf("%.*s\n",len,sub);

如果您需要一个不同的子字符串副本,则必须复制。


2

这应该可以正常工作:

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

using namespace std;

int main()
{
 char t[200];
 cin.get(t, 200);
 int i = 5; 
 int j = 10;
 char *to = (char*) malloc(j-i+1);
 strncpy(to, t+i, j-i);
 to[j-i]='\0';
 cout << to;
}

你可以像这样使用new代替malloc:
char* to = new char[j-i+1];

1
为什么要使用new时,还有malloc - masoud

1
这段代码没有进行边界检查,无法确保目标数组足够大。
char newt[200];   
// copy j-i chars from position t+i to newt array
strncpy(newt, t + i, j-i);
// now null terminate
newt[j-i] = 0;

1
使用两个指针来表示字符串中的范围。
char const * beg = t+i;
char const * end = t+j+1;    
std::cout.write(beg, end-beg);

或者你可以使用一个封装了这个想法的类。标准库中提出了类似于这样的东西。同时,你可以编写自己的类,或者使用库中的一个。例如,llvm::StringRef

llvm::StringRef sref(t+i, j+1-i);
std:cout << sref;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接