Как удалить кавычки из строки в C - PullRequest
3 голосов
/ 22 августа 2011

Я пытаюсь удалить все кавычки в данной строке, кроме обратной косой черты, за которой следует кавычка

, что я сделал, это

for (int i = 0; i < lineLength; i ++) {

        if (line[i] == '"' ) { 
                if (line[i-1] == '\\') // if \" is used   
                        line[i-1] = '"'; // then print \
                line[i] = '\0'; // or 0
        }
}

Это удаляет все символы в строке.Что я могу сделать, чтобы удалить только кавычки?Любая помощь будет оценена ...

Ответы [ 4 ]

6 голосов
/ 22 августа 2011

Ваша проблема line[i] = '\0'; - она ​​завершает строку.

Если вы хотите удалить символы из строки C, вам нужно держать два индекса - один для чтения и один для записи, зацикливание начитайте индекс, читая каждый символ, и пишите только те, которые вы хотите сохранить, используя второй индекс.

Что-то вроде:

int j = 0;
for (int i = 0; i < lineLength; i ++) {
            if (line[i] != '"' && line[i] != '\\') { 
                 line[j++] = line[i];
            } else if (line[i+1] == '"' && line[i] == '\\') { 
                 line[j++] = '"';
            } else if (line[i+1] != '"' && line[i] == '\\') { 
                 line[j++] = '\\';
            }
}

//You missed the string termination ;)
if(j>0) line[j]=0;
2 голосов
/ 22 августа 2011

Вы устанавливаете первый найденный символ " на нулевой символ, заканчивая строку.

Также в стороне, но line[i-1] может вызвать ошибку сегментации при i == 0 илиможет содержать \, и в этом случае первая кавычка не будет удалена.

Что-то подобное сделает то, что вы хотите:

char *lineWithoutQuotes = malloc(strlen(line));
int i, j;
if(line[0] != '"')
    lineWithoutQuotes[0] = line[0];
for(i = j = 1; i < strlen(line); i++){
    if(line[i] == '"' && line[i-1] != '\\')
        continue;
    lineWithoutQuotes[j++] = line[i];
}
1 голос
/ 22 августа 2011

Обычный метод с использованием индексов:

int j = 0;
for (int i = 0; i < lineLength; i++)
{
    if (line[i] == '\\')
    {
        line[j++] = line[i++];
        line[j++] = line[i];
        if (line[i] == '\0')
            break;
    }
    else if (line[i] != '"')
        line[j++] = line[i];
}
line[j] = '\0';

С помощью указателей (и не нужных lineLength) это:

char *dst = line;
char *src = line;
char c;

while ((c = *src++) != '\0')
{
    if (c == '\\')
    {
        *dst++ = c;
        if ((c = *src++) == '\0')
            break;
        *dst++ = c;
    }
    else if (c != '"')
        *dst++ = c;
}
*dst = '\0';

Или небольшие вариации на эти темы ...

0 голосов
/ 22 августа 2011
int newPos = 0;
for (int oldPos = 0; oldPos < lineLength; oldPos++) {
    if (!(line[newPos] == '"' && (!newPos || line[newPos-1] == '\\'))) {
       line[newPos] = line[oldPos];
       newPos++;
    }
}
line[newPos] = 0;
...