對于背景關系,我正在string用 C 重寫該類以在微控制器上使用,特別是 Arduino,這樣它就不會使用 Arduino 不支持的標準庫函式。
我在這里查看了幾個答案,這些答案顯示了如何從char*. 但是,在我的函式中,它似乎沒有正確編輯char*.
我的弦樂課
#include <stdlib.h> // malloc
namespace micro_std {
class string {
private:
const int MAX_SIZE = 4096; // Maximum size on 16bit controllers.
char* data = nullptr;
int _length = 0;
public:
string(char* data) {
this->data = data;
for (int i = 0; data[i] != '\0'; i )
_length ;
}
int size(void) const { return _length; }
int length(void) const { return _length; }
int max_size(void) const { return MAX_SIZE; }
bool empty(void) const { return _length == 0; }
char at(int index) const { return data[index]; }
char back(void) const { return data[_length - 1]; }
char front(void) const { return data[0]; }
char* str(void) const { return data; }
void clear(void) { _length = 0; data = nullptr; }
// removed for brevity //
char pop_back(void) {
_length--;
char character = data[_length];
data[_length] = '\0';
return character;
}
// removed for brevity //
};
}
以及我如何測驗我的代碼,特別是pop_back功能。
#include <stdio.h> // printf
#include "micro_std/string.h"
int main(int argc, char** argv) {
micro_std::string x = "abcdef";
// Testing pop_back function
printf("%d %s\n", x.length(), x.str());
for (int i = 0; i < 5; i ) {
char res = x.pop_back();
printf("%d %c %s\n", x.length(), res, x.str());
}
//printf("%s\n", x.str());
return 0;
}
并且,如果需要,我的編譯器引數
g -w -std=c 2a -O3 program.cpp -o program
運行這個程式會給我以下輸出:
6 abcdef
5 f abcdef
4 e abcdef
3 d abcdef
2 c abcdef
1 b abcdef
而不是我想要的輸出:
6 abcdef
5 f abcde
4 e abcd
3 d abc
2 c ab
1 b a
輸出格式為“(長度)(彈出字符)(結果字串)”。為什么呼叫函式data時資料成員沒有被改變?pop_back
uj5u.com熱心網友回復:
為什么呼叫 pop_back 函式時資料成員資料沒有被改變?
即使代碼編譯(它不應該編譯,因為你試圖x用字串文字構造,這是一個const char[]不能分配給非 const 的陣列char*),x將其data成員指向字串文字,因此data[_length] = '\0';在里面ofpop_back()會呼叫未定義的行為試圖改變只讀記憶體。
為了使您的代碼作業,您必須制作輸入資料的副本,例如:
#include <stdlib.h> // malloc
namespace micro_std {
class string {
private:
const int MAX_SIZE = 4096; // Maximum size on 16bit controllers.
char _data[MAX_SIZE];
int _length = 0;
public:
string(const char* str) {
for (int i = 0; str[i] != '\0'; i) {
data[i] = str[i];
_length;
}
data[_length] = '\0';
}
...
void clear(void) { _length = 0; }
...
};
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/438342.html
