2012-01-25 33 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 
} 
相關問題