Ahí va el código completo:
String.h
#ifndef _String_h_
#define _String_h_
#include <cstdlib>
#ifndef NULL
#define NULL 0
#endif
class String {
public:
String();
String(const char *init_value);
unsigned int getNumCharacters();
bool isEmpty();
const char *toString();
void append(const char *data);
char charAt(unsigned int index);
void toUpperCase();
void toLowerCase();
void replaceData(const char *data);
void replaceChar(char oldChar, char newChar);
void clear();
private:
char *_value;
unsigned int _num_characters;
};
#endif
String.cpp
#include "string.h"
String::String() {
_value = (char *)calloc(1, 1);
_num_characters = 1;
}
String::String(const char *init_value) {
unsigned int num_characters = 0;
while(init_value[num_characters] != (char)NULL)
num_characters += 1;
_num_characters = num_characters;
_value = (char *)malloc(num_characters + 1);
_value[num_characters] = (char)0;
for(unsigned int i = 0; i < num_characters; i++)
_value[i] = init_value[i];
}
unsigned int String::getNumCharacters() {
return _num_characters;
}
bool String::isEmpty() {
return _num_characters == 1;
}
const char *String::toString() {
char *result = (char *)malloc(_num_characters + 1);
result[_num_characters + 1] = (char)NULL;
for(unsigned int i = 0; i <= _num_characters; i++)
result[i] = _value[i];
return result;
}
void String::append(const char *data) {
unsigned int num_data_characters = 0;
unsigned int new_num_characters;
while(data[num_data_characters] != (char)NULL)
num_data_characters += 1;
realloc(_value, _num_characters + num_data_characters + 1);
_value[_num_characters + num_data_characters] = (char)NULL;
new_num_characters = _num_characters + num_data_characters;
for(unsigned int i = 0; i < num_data_characters; i++)
_value[i] = data[i];
_num_characters = new_num_characters;
}
char String::charAt(unsigned int index) {
return _value[index];
}
void String::toUpperCase() {
for(unsigned int i = 0; i <= _num_characters; i++) {
if(_value[i] >= (char)97 && _value[i] <= (char)122)
_value[i] -= (char)32;
}
}
void String::toLowerCase() {
for(unsigned int i = 0; i <= _num_characters; i++) {
if(_value[i] >= (char)65 && _value[i] <= (char)90)
_value[i] += (char)32;
}
}
void String::replaceData(const char *data) {
unsigned int num_characters = 0;
while(data[num_characters] != (char)NULL)
num_characters += 1;
_num_characters = num_characters;
realloc(_value, num_characters + 1);
_value[num_characters] = (char)0;
for(unsigned int i = 0; i < num_characters; i++)
_value[i] = data[i];
}
void String::replaceChar(char oldChar, char newChar) {
for(unsigned int i = 0; i <= _num_characters; i++) {
if(_value[i] == oldChar)
_value[i] = newChar;
}
}
void String::clear() {
realloc(_value, 1);
_value[0] = (char)NULL;
_num_characters = 1;
}
main.cpp
#include <iostream>
#include "string.h"
int main(int argc, char *argv[]) {
String cadena = "";
cadena.replaceData("Hola, soy un programador :'D");
std::cout << cadena.toString();
std::cin.get();
return 0;
}
Solo digo que con MinGW funciona perfectamente y con el compilador de VisualStudio 2013 (no se como se llama), me da errores (no de compilación, sino de ejecución)