我正在尝试删除给定行中的所有引号,除了反斜杠后跟引号
我所做的就是这个
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
}
}
这会删除该行中的所有字符..我该怎么做才能删除引号? 任何帮助将不胜感激......
答案 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;