9

我有

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

substriing(i,j)除了t将每个元素分别复制到另一个数组之外,还有什么简单的方法吗?没有strings等只是char t[200]

4

6 回答 6

7

如果允许修改t,则可以设置t[j]0,然后用于t + i获取子字符串。

如果没有,您将不得不制作副本。

就是说,为什么您不能使用std::string并省去自己的头痛?

于 2013-03-23T12:11:43.940 回答
5
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;
}
于 2014-04-04T16:10:59.863 回答
3

如果您只需要读取数据,那么 t+i 就是您想要的,唉,您必须管理子字符串的长度......

char *sub = t+i;
int len = j-i;
printf("%.*s\n",len,sub);

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

于 2013-03-23T12:13:47.950 回答
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];
于 2013-03-23T12:24:07.650 回答
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;
于 2013-03-23T12:12:31.853 回答
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;
于 2013-03-23T13:07:30.297 回答