2011-08-22 82 views
3

我想刪除所有報價在給定的線,除了反斜槓後跟一個引號去掉引號如何從一個字符串用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 
     } 
} 

這將刪除所有字符在行..我能做些什麼來刪除只引號? 任何幫助,將不勝感激...

回答

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

正常的方法是:

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

或在這些主題上的細微變化...

相關問題