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);
}
*向我們顯示您的代碼*。到目前爲止你有什麼和哪裏出錯? – 2011-02-02 00:21:16
@Jonathan Grynspan我發佈了我的代碼,但它不能很好地工作。 – jmasterx 2011-02-02 00:24:38