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

我试图删除给定行中的所有引号,除了反斜杠后跟一个引号

我所做的就是这个

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 } } 

这将删除行中的所有字符..我该怎么做才能删除引号? 任何帮助,将不胜感激…

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

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

另外,但是当i == 0时, line[i-1]可能会导致分段错误,或者它可能恰好包含\在这种情况下,第一个引用不会被剥离。

像这样的东西会做你想要的:

 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]; } 

使用索引的常规技术是:

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

或者那些主题的微小变化......

 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;