2012-01-25 35 views
0

我有一个字符串对象,真的很长,我想引用它的窗口[0,19],[1,20],... ..,[980,1000]为char x[20]如何从一个非常长的C++字符串做char * kmers

让我们打电话给我们的字符串foo。我试过

x = &foo[i] 

和迭代,但我得到一个不兼容的类型错误,因为&foo[i]char *类型。

我该如何使用char x[20]来引用我们字符串foo的内存的20个字符块?

更具哲理性的是,如果后者不是空终止,char *xchar x[20]之间有什么区别?

通过为所有新字符创建全新的内存块,一个目标不是必须具有2倍的内存要求。

回答

1

请看看llvm的StringRef类。基本上,它只是持有两个指针,一个开始和一个结束。你可以做这样的事情,例如:

std::string source = "... something really long ..."; 
const char * b = source.c_str(); 
llvm::StringRef window(b + 100, 20); 

window现在是指source部分的实体。你可以调用begin()end()来获得迭代器。您可以打印它就像一个正常的字符串,像这样:

std::cout << window; 

它配备了各种其他常见字符串操作的,你可以在docs看到。

+0

谢谢,但我需要的类型是char *或焦炭X [20 ] – Deniz

+0

@Deniz:有一个成员函数'data()'给你一个const char *。 –

+0

感谢您的回答,但我相信这并没有达到目标;因为当我使用“data()”时,指针/内存块是否存在?这个想法是能够将一个char *传递给一个函数,作为一个指向我更持久的长字符串的指针,但只能指向窗口中的前20个字符。可能是不可能的。 – Deniz

0

只是做

int window_size = 20; 
for (size_t i = 0; i < foo.size() - window_size; ++i) 
{ 
    const char* x = foo.data() + i; 
    // Do something with x[0] to x[window_size - 1] 
} 
0

你得到“不兼容的类型错误”的原因是,x&foo[i]是不同类型的。这样考虑:

  • foochar[]类型(即char阵列)
  • 因此foo[i]是类型char
  • 因此
  • &foo[i]的是char*类型的(即,指针char

char* xchar x[20]之间的区别在于在第一种情况下x是指向char的指针,在第二种情况下,它是一个数组char。在第一种情况下,您可以将指针指向进程内存中的任何char。在第二种情况下,x通常可以像指针一样工作,但始终指向数组的开头。

假设foo的大小是窗口大小的倍数,可以通过这样的窗口迭代:

char foo[FOO_SIZE]; 
for (unsigned i = 0; i < FOO_SIZE; i += WINDOW_SIZE) { 
    char first_char = foo[i]; 
    char last_char = foo[i + WINDOW_SIZE - 1]; // Warning: if foo size is not multiple of window size, this may exceed foo in the last window 
} 

而且,你自己的代码可能是罚款,只是从&foo[i]删除符号。请注意,[]已取消引用指针,因此不需要额外的&

1

char * p是一个指向内存的地方,应该包含字符。没有数据隐含的结尾。 char a[100]是一个100字符的内存部分。编译器知道a的结尾是用于访问多维数组以及错误检查函数参数。 & a [0]或者只是一个(a的元素0的地址)与char *基本相同。

一个或P的用户必须知道某种方式长度:

1)除了供给的长度参数。例如:sizeof(a)(以字节为单位)。 我也喜欢使用numof(a)这是可以的元素,而不是字节大小通过添加: #define numof(X) (sizeof(X)/sizeof(*X)) 而不是长度,您还可以使用另一个指针结束停止在。 2)某些内容或规则告诉用户何时停止。例如:*p == 0(NULL)

这是C/C++的一个强大的灵活性来源(如果被滥用,也是很危险的)。


a)更改数组的用户也有一个长度限制或指针结束停止在。 如果最后的块尺寸过小,您可能还需要空终止检查。

b)一次仅处理一个数据块的数据。那么你只有新的1个额外的20个字符数组。 或者,如果你能保证没有其他线程正在使用的阵列的同时,您可以临时更改空终止:

// array is assumed to be a multiple of 20 plus 1 more for null 
char * ptr = array; 
while (ptr < array + sizeof(array)-1) 
{ 
    char * end = ptr + 20; // we will stop here 
    char save_char = *end; // save the character there 
    *end = 0; // put in temporary null 
    ProcessBlock(ptr); // now null terminated ! 
    *end = save_char; // restore the array 
    ptr = end; // end of this block is start of next 
} 
相关问题