2014-01-26 8 views
-1

Я хочу, чтобы удалить двойные кавычки из строки, например 13.3" Rentina становится 13.3 RentinaC++ Как удалить двойные кавычки в полукоксе

const char* s = sheet->readStr(row, col); 
int ii = strlen(s); 
char* b; 
b=(char*)s; 

char ch; 
for (int i = 0; i < ii ;++i) { 
    strncpy(&ch, b+ii, 1); 
    if(ch == '\"'){ 
    ch = '\"'; 
    memcpy(b+i, &ch, 1); 
    } 
} 

myfile << b; 
+0

Вы можете уточнить свой вопрос? – Dave

+2

От чего страдает ваш код? – Maroun

+1

Что именно вы пытаетесь сделать? – phoeagon

ответ

0

Вы не можете сделать b=(char*)s !!!

Компилятор позволяет вам использовать этот, но вы получите исключение во время выполнения, как только вы попытаетесь записать в адресное пространство памяти, указанное b.

Переменная s является возможно указует на адрес в кодовой секции, которая является только для чтения адресного пространства памяти в вашей программе («возможно», потому что, возможно, что const декларация s это вы добавили только что-то по собственной инициативе).

Вы должны выделить новый массив char и вместо этого скопировать выходную строку в этот массив.

В первую очередь измените приведенный выше оператор на b = (char*)malloc(strlen(s)).

Кроме того, не переходите на strncpy (или любую другую функцию str) на адрес переменной char. Эти функции работают с массивами char и либо предполагают, что массив заканчивается символом 0, либо задают символ в конце массива равным 0.

Вы можете попробовать следующий фрагмент кода (при условии, что ваша цель чтобы удалить '"'):

const char* s = sheet->readStr(row, col); 
int ii = strlen(s); 
char* b = (char*)malloc(ii+1); 
if (b != NULL) 
{ 
    int i,j; 
    for(i=0,j=0; i<ii; i++) 
    { 
     if (s[i] != '"') 
      b[j++] = s[i]; 
    } 
    b[j] = 0; 
    // Add your code here (do whatever you wanna do with 'b') 
    free(b); 
} 
else 
{ 
    printf("Out of memory\n"); 
} 
+0

«Вы не можете делать b = (char *) s !!!" - на самом деле это зависит от того, что 'sheet-> readStr (строка, col);' возвращает. Если он возвращает указатель на записываемое пространство, то вполне нормально писать это пространство через 'b', неважно, был ли адрес преобразован в' const char * ', а затем обратно в' char * '. –

0

Если вы имеете дело со строками в C++, вы должны использовать символьные массивы и функции, такие как strncpy только тогда, когда у вас есть веские основания для их использования. По умолчанию вы должны использовать стандартную строку, которая делает, например, управление памятью намного проще. Решение вашей проблемы с std :: string:

std::string s = sheet->readStr(row, col); 
size_t pos = 0; 
while ((pos = s.find('"', pos)) != std::string::npos) 
    s = s.erase(pos, 1); 
myfile << s; 
+0

спасибо! это работает. но имеют проблемы с кодированием. Например, моя запись в utf-8. когда я получил результат «TT», «TЄЄn sbєЈn phbє», «Bб» ™ vi xb »lГ. Можете ли вы мне помочь !! спасибо вам большое – hoaivn9

Смежные вопросы