如何从C中的字符串中删除引号

时间:2011-08-22 06:34:27

标签: c quotes

我正在尝试删除给定行中的所有引号,除了反斜杠后跟引号

我所做的就是这个

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 个答案:

答案 0 :(得分:6)

您的问题是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;

答案 1 :(得分:2)

您正在将找到的第一个"字符设置为空字符,从而终止该字符串。

另外,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}}

答案 2 :(得分:1)

使用索引的常规技术是:

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';

这些主题的细微变化......

答案 3 :(得分:0)

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;