2012-09-16 73 views
0

我想刪除字符串中的換行符'\ n'。如何刪除字符串中的換行符

char *string ="hallo\n"; 

    int i=0; 
    int length = sizeof(string); 

    while(i<length) 
    { 
     if(string[i+1] == '\n') 
     { 
      string[i+1] = '\0'; 
      break; 
     } 
     i++; 
    } 

    printf("%s",string); 
    printf("world"); 

我知道,我可能只是產生一個新的陣列,它是這樣工作的

char *string ="hallo\n"; 

int i=0; 
int length = sizeof(string); 
int lengthNew = length -1; 
char newStr[lengthNew]; 
    while(i<length) 
    { 
     printf("Char ist %c:",string[i]); 
     newStr[i] = string[i]; 
     if(string[i+1] == '\n') 
      break; 
     i++; 
    } 

但是,爲什麼使用堆棧如果我簡直舊陣列中分別代替一個字符?

+0

是否保證字符串中只有一個換行符,並且它出現在最後? –

+0

總是在字符串的結尾處是\ n字符嗎?或者它可以在中間? (例如,''hello \ nworld'') –

+0

是的......它實際上是ctime(&clock) – Fendrix

回答

2

如果換行符始終是字符串的最後一個字符,那麼您可以像描述的那樣對其進行編碼。

否則,您必須創建第二個字符緩衝區並將字符複製到第二個緩衝區。原因是在C中,\0字符標記了字符串的結尾。

如果您有像這樣的字符串:"this \n is \n a \n test",那麼在您更換後,內存將如下所示:"this \0 is \0 a \0 test"。大多數C程序將簡單地將其解釋爲字符串"this ",並在第一個空值後忽略所有內容。

編輯 正如其他人指出的那樣,您的代碼還存在其他問題。 sizeof()將返回字符指針的大小,而不是字符串的長度。也不可能修改只讀字符串文字。

+0

謝謝你然後...得到它:) – Fendrix

-2
char *string = ctime(&myTimeT); 
char *c = strrchr(string, '\n'); 

if (c != NULL) 
    *(c) = '\0'; 
+0

這隻會發現'\ n'的*最後*的出現,你只是將一個NULL結束符放到字符串中的任意位置。 -1 –

+0

OP在註釋中特別指出,它是爲了在由'ctime'返回的字符串的末尾(即,非const並且在末尾具有單個'\ n')的末尾去除'\ n'。 –

+0

你說得對,我沒有看到那個評論。但是,您的解決方案仍然會修改只讀字符串,因此在刪除UB之前我無法刪除downvote。另外,如果換行符總是最後一個字符,則根本不需要使用'strrchr'。 –

3

基於您的評論,我提供了一個完全不同的,但更好的解決辦法:strftime

time_t clock = time(NULL); 

char buf[1024]; 

strftime(buf, sizeof buf, "%c", localtime(&clock); 

printf("The date is: %s\n", buf); 

%c格式是一樣的使用由ctime,但strftime更加靈活。