2016-01-11 54 views
-1

我需要用空字符」「替換」(ASCII值34)char「。用空字符替換「」「

在輸出中,而不是引用我得到一個「?」問號字符。 我試圖用之類的東西:

mystring[itit] = ""; 

mystring[itit] = ''; 

mystring[itit] = "\O"; 

我的代碼:

strcpy(mystring ,op->data.value.str ); 
      for(itit=0;itit<10;itit++) 
      { 
      if(mystring[itit] == 34) 
      { 
       mystring[itit] = NULL; 
      } 


      } 
      printf("%s\n",mystring); 

任何想法如何解決呢?

對於澄清:MyString中的字符串是這樣的:

「你好」

「地方」

「學校」

所有帶引號 - 我其實需要刪除他們得到:

hello

地方

學校

+0

爲什麼你認爲使用'\ 0'在C字符串結束前是否可以?'\ 0'是C中的終結符。它表示字符串結束。 – Magisch

+1

你真的想要做什麼?你是否想要刪除引號字符字符串而不是替換它的東西? – Bathsheba

+0

是的,我實際上需要刪除它 –

回答

3

你需要做的是刪除字符,而不是取代它,因爲你不與任何替換它。要做到這一點,當您發現字符是問題時,您需要將其餘字符向下移動。

int i,j; 

strcpy(mystring, "aa\"bb\"cc"); 
for(i=0,j=0;i<10;i++) 
{ 
    if(mystring[i] != '"') 
    { 
     mystring[j] = mystring[i]; 
     j++; 
    } 
} 
mystring[j] = '\0'; 
printf("mystring=%s\n",mystring); 

結果:

mystring=aabbcc 
2
int removeChar(char *str, char c) { 

    int i, j; 

    for(i = 0, j = 0 ; str[i] ; i++){ 
     if(str[i] == c) continue;  // skip c do not copy it 
     str[j] = str[i];    // shift characters left 
     j++; 
    } 
    str[j]=0; // terminate the string 
    return j; // return the actual size 
} 
+0

可能比我的初學者更清晰,因爲它不依賴指針「算術」。加一。 – Bathsheba

+0

@Bathsheba,謝謝 – milevyo

0

在C中,字符串是簡單地用一個NUL(0)在端部的字符陣列。 (它們不能包含NUL)。與任何數組一樣,不能簡單地「移除」一個元素。您需要將所有以下元素轉換爲一個位置,結果是最後會出現不需要的元素。使用字符串這個額外的元素不是一個巨大的問題,因爲NUL仍然可以識別字符串結束的位置。

在這種情況下,您首先複製字符串,因此您可以在不需要刪除字符的情況下將其複製。除非你知道有多少這樣的人物存在,你需要在整個字符串新的字符串已經分配了足夠的空間,你要複製:

/* Before this, you must ensure that mystring has enough space */ 
{ 
    char* out = mystring; 
    const char* in = op->data.value.str; 
    do { 
    if (*in != '"') *out++ = *in; 
    } while (*in++); 
} 

注:我用的是事實,字符串是NUL結尾終止循環,這使我無需事先知道多久的時間op->data.value.str。出於這個原因,我使用字符指針而不是索引。

2

刪除從字符串中的字符,你可以這樣做:

void remove(char* str, char rm) 
{ 
    char *src, *dst; 
    for (src = dst = str; *src != '\0'; ++src) { 
     *dst = *src; 
     if (*dst != rm) ++dst; 
    } 
    *dst = '\0'; /*insert terminator at the new place*/ 
} 

rm等於34

該算法是衆所周知的調用;我從Kernighan & Ritchie採納了它。用調試器仔細研究它。

0

沒有「空白字符」。一個字符串可以是空的,沒有字符,但是一個字符是一個原子元素,不能是空的,就像一盒蘋果可以是空的,但是不能有一個「空蘋果」。

相反,您需要刪除引號並關閉它們佔用的空間。更重要的是,如果你自己做的拷貝,只是不復制它們:

char *psrc = op->data.value.str; 
char *pdest = mystring; 

while (*psrc != '\0') 
{ 
    if (*psrc != '\"') 
    { 
     *pdest = *psrc; 
     ++pdest; 
    } 
    ++psrc; 
} 
*pdest = '\0'; 
0

你可以用它來去除所有「\」「 - 人物:

void stripquotes(char *ptr) { 
    char *ptr2 = ptr; 
    do { 
     *ptr2 = *ptr++; 
     if (*ptr2 != '\"') 
      ptr2++; 
    } while (*ptr); 
}