2015-10-29 154 views
-1

我有我想刪除空格的句子,但我正在閱讀文本文件。這裏的詞的樣本:刪除句子之間的空格。

the tree hugged the man 
there are many trees 
where are the bees 

所以它應該是:

thetreehuggedtheman 
therearemanytrees 
wherearethebees 

這裏是我到目前爲止有:

int main(int argc, char* argv []) { 

    int i = 0, line = 6; 
    char word[100]; 

    char const* const fileName = argv[1]; 
    FILE *file = fopen(fileName,"r"); 
    while(line--){ 
     fgets(word, 100, file); 
     i++; 
     char *wordRev = reverse(word); 

     // Remove spaces from string here 



    } 

    fclose(file); 

    return 0; 
} 
+1

「reverse」與刪除空格有什麼關係? – Lundin

回答

3

隨着使用strtoksprintf可以實現 -

char s[100];         // destination string 
int i=0; 
while(fgets(word, 100, file)!=NULL){   // read from file 
    memset(s,'\0',sizeof s);     // initialize (reset) s in every iteration 
    char *token=strtok(word," ");   // tokenize string read from file 
    while(token!=NULL){      // check return of strtok   
      while(s[i]!='\0')i++;     
      sprintf(&s[i],"%s",token);   // append it in s 
      token=strtok(NULL," "); 
     } 
    printf("%s\n",s);       // print s 
} 

使用fgets控制迴路。循環將停止爲fgetsreturnNULL

請注意,s將在每次迭代中修改,因此如果您想稍後在程序中使用它,請將修改的字符串複製到另一個陣列。

+0

雖然這可能起作用,但看起來相當低效。不要一直調用strlen,而應該有一個指針來跟蹤您正在寫入的目標緩衝區中的哪個位置。如果你真的想刪除空格,你也需要在某處執行'token + 1'。 – Lundin

+0

@Lundin是的,我得到了'strlen'部分,並刪除了這些電話。但我沒有'token + 1'。爲什麼會這樣? – ameyCU

+0

@Lundin但是,謝謝你指出,我需要改進更多:-) – ameyCU

0

如果你想刪除線的空間,你總是可以解析出來:

#include <stdio.h> 


#define MAXLN 100 

void remove_spaces(char line[]); 

int main(int argc, char *argv[]) 
{ 
    int line = 6; 
    char word[MAXLN]; 

    char const* const filename = argv[1]; 
    FILE *file = fopen(filename, "r"); 

    while (line--) { 
     fgets(word, MAXLN, file); 
     remove_spaces(word); 
    } 

    return 0; 
} 

void remove_spaces(char line[]) 
{ 
    char no_spaces[MAXLN]; 
    for (int i=0, j=0; line[i] != '\0'; i++) { 
     if (line[i] == ' ') continue; 
     no_spaces[j++] = line[i]; 
    } 
    no_spaces[j-1] = '\0' 
    printf("%s\n", no_spaces); 
} 
+0

這迭代超過100個字符,無論實際的字符串長度,加上它帶有memset開銷。非常低效。 – Lundin

+0

這有什麼關係?爲什麼編寫不必要的慢代碼時,你可以毫不費力地獲得更快的代碼?職業道德。 – Lundin

+0

@Lundin你是對的我編輯了低效的部分。 – tijko

2

爲了保持它的簡單和通用越好:

void remove_char (char ch, char* dest, const char* source) 
{ 
    while(*source != '\0') 
    { 
    if(*source != ch) 
    { 
     *dest = *source; 
     dest++; 
    } 
    source++; 
    } 

    *dest = '\0'; 
} 
0

使用一個簡單的函數,通過數組並跳過空格字符。

void rmSpace(char *string) 
{ 
    size_t len = strlen(string) , index = 0; 

    for(size_t n = 0 ; n < len ; n++) 
    { 
     if(string[n] != ' ') 
     { 
      string[index] = string[n]; 
      index++; 
     } 
    } 
    string[index] = '\0'; 
}