如何从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;