簡體   English   中英

C ++字符串附加上的奇怪行為

[英]strange behavior on c++ string append

我在類s.append(ptr2str ....);的行中對c ++字符串對象有一個奇怪的問題s.append(ptr2str ....);

class cRegexMatches {
public:
    char *ptr2str;
    int   *pOffsets;
    cRegexMatches() { ptr2str = NULL; pOffsets=NULL;}
    void update(char *p, int *offsets) {
        ptr2str = p; pOffsets = offsets;
        printf("ptr2str=%p %s|\n", p, p);
    }
    string operator [] (int id) {
        string s;
        printf("operator[] %p %s|", ptr2str, ptr2str);
        int i;
        for (i=0; i<4; i++) printf(" %d", pOffsets[i]);
        printf("\n");
        if (!ptr2str) return s;
        if (pOffsets[2 * id + 1] == 0) return s;
        int len = pOffsets[2 * id + 1] - pOffsets[2 * id];
        printf("size %d %ld before %s\n", s.size(), len, ptr2str + pOffsets[2 * id]);
        s.append(ptr2str + pOffsets[2 * id], len);
        cout << s << endl;
        return s;
    }
};

使用以下代碼可以正常運行。

int main(int argc, char *argv[]) {
    char *p = "10.20.0.111:8080";
    int pInts[] = {0, 16, 0,16};
    regmatches.update(p, &pInts[0]);
    string s =  regmatches[0];
    int i;
    for (i=0; i<s.size(); i++) {
        printf("%c\n", s.c_str()[i]);
    } 
    return 0;
}

但是在我的項目中,這行s.append(ptr2str + pOffsets[2 * id], len); 根據s.append之前的調試語句printf(..)並隨后的cout ... ,似乎破壞了第一個字節為\\ x00。

知道是什么導致了奇怪的行為嗎? 謝謝!

更新1

感謝@ user657267的建議,以下是有關在我的項目中如何使用代碼的簡短說明。 看起來很無辜。

cRegexMatches globalVar;

//p points to some c string 
//pInt points to an array of integers, in my case, it's 0,  16, 0, 16
globalVar.update(p, pInt);
cout << globalVar[0]

現在,我找到了一種解決方法:我更改了s.append(ptr2str + pOffsets[2 * id], len); return string(ptr2str + pOffsets[2 * id], len); 而且效果很好。 但是我仍然對導致這種奇怪行為的原因感到好奇。

我認為問題可能出在您對main中字符串的定義。

char* p = "10.20.0.111:8080";

應該

char p[] = "10.20.0.111:8080";

只有第二個定義在堆棧上保留內存。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM