2011-02-02 80 views
0

這是我的情況。查找給定列和行的char數組中的索引?

我有一個單詞換行算法,可以在寬度太大或在文本中找到\ n或' - '時生成文本行。

因此它不在文本行本身中包含'\ n'。這對我來說是具有挑戰性的部分。

我試圖做一個算法,將返回字符數組中的索引,給定一個行和一列。

因此,如果第1行的長度爲20,第2行的長度爲10,那麼如果第1行最初有一個'\ n',它應該說明這一點。

例:

的文字是:

Hello blue sky\nworld 

我們再得2線:

Hello blue sky 
world 

現在如果我的插入符由 '|'我在這裏把它:

Hello blue sky 
    |world 

結果是不是14字符,而是15個字符,因爲看不見的「\ n」,必須考慮。

棘手的部分是,如果換行決定生成一個「\ n」

如:

Hello blue 
    sky 
    |world 

在這種情況下,結果應該還是15,因爲換行推向一個新的行,但不是因爲文本中出現'\ n'。

感謝

Here is my mess so far: 

int AguiTextBox::indexFromColumnRow(int column, int row) 
{ 
    int len = 0; 
    int charCount = 0; 
    std::string curChar; 

    int curLen = 0; 
    int bytesSkipped = 0; 
    std::string::const_iterator it = getText().begin(); 
    std::string::const_iterator end = getText().end(); 

    if(textRows.size() == 0) 
    { 
     return -1; 
    } 
    for(int i = 0; i < row; ++i) 
    { 
     len = _unicodeFunctions.getUtf8StringLength(textRows[i]); 

     for(int j = 0; j < len; ++j) 
     { 
      //skip characters that would not have passed the newline test 
      do 
      { 
       curLen = _unicodeFunctions.bringToNextUnichar(it,end); 
       curChar = getText().substr(bytesSkipped,curLen); 
       bytesSkipped += curLen; 
       charCount++; 
      } 
      while(curChar[0] < ' '); 
     } 

    } 

    len = len = _unicodeFunctions.getUtf8StringLength(textRows[row]); 


    if(column == 0 && charCount + 1 < getTextLength()) 
    { 
     curChar = _unicodeFunctions.getUtf8SubStr(getText(),charCount,1); 

     while(charCount < getTextLength() - 1) 
     { 
      if(curChar[0] < ' ' && curChar[0] != '\n') 
      { 
       charCount++; 
       curLen = _unicodeFunctions.bringToNextUnichar(it,end); 
       curChar = getText().substr(bytesSkipped,curLen); 
       bytesSkipped += curLen; 
      } 
      else 
      { 
       break; 
      } 
     } 
     if(curChar[0] == '\n') 
     { 
      charCount++; 
      curLen = _unicodeFunctions.bringToNextUnichar(it,end); 
      curChar = getText().substr(bytesSkipped,curLen); 
      bytesSkipped += curLen; 
     } 
    } 
    for (int i = 0; i < column; ++i) 
    { 
     do 
     { 
      curLen = _unicodeFunctions.bringToNextUnichar(it,end); 
      curChar = getText().substr(bytesSkipped,curLen); 
      bytesSkipped += curLen; 
      charCount++; 
     } 
     while(curChar[0] < ' '); 
    } 

    return charCount - 1; 
} 

//and the opposite 
AguiPoint AguiTextBox::columnRowFromIndex(int index) 
{ 
    std::string::const_iterator it = getText().begin(); 
    std::string::const_iterator end = getText().end(); 

    std::string curChar; 
    int charCount = 0; 
    int len = 0; 
    int byteCount = 0; 
    int curLen = 0; 
    for(int i = 0; i < (int)textRows.size(); ++i) 
    { 
     len = _unicodeFunctions.getUtf8StringLength(textRows[i]); 

     for(int j = 0; j < len; ++j) 
     { 

      //skip characters if needed 
      curLen = _unicodeFunctions.bringToNextUnichar(it,end); 
      curChar = getText().substr(byteCount,curLen); 
      byteCount += curLen; 

      while (curChar[0] < ' ' && curChar[0] != '\n') 
      { 
       curLen = _unicodeFunctions.bringToNextUnichar(it,end); 
       curChar = getText().substr(byteCount,curLen); 
       byteCount += curLen; 
      } 
      if(curChar[0] == '\n') 
      { 
       charCount++; 
       if(charCount == index) 
       { 
        return AguiPoint(j,i); 
       } 

      } 
      charCount++; 
      if(charCount == index) 
      { 
       return AguiPoint(j,i); 
      } 



     } 
    } 
    return AguiPoint(len,textRows.size() - 1); 
} 
+0

*向我們顯示您的代碼*。到目前爲止你有什麼和哪裏出錯? – 2011-02-02 00:21:16

+0

@Jonathan Grynspan我發佈了我的代碼,但它不能很好地工作。 – jmasterx 2011-02-02 00:24:38

回答

0

這不是很清楚,我正是你需要的數據做什麼。你想寫一個編輯器或者什麼?

你可以做的一件事是建立一個指向每行開始的指針數組,也許每行的長度也是如此。

這樣,您可以表示所有行而不修改底層數據。

但是你應該更好地描述轉換數據的要求。