2017-10-10 78 views
-3

代碼正在工作它削減第一個單詞,並把它,最後,文本。我不明白代碼中的一行,比方說我的字符串是「hello world」。c指針和內存 - 瞭解

當我使用代碼「* p ++ ='\ 0';」此行之前

p: "world"

   s: "hello world" 

此行之後:p: "world"

   s: "hello" 

爲什麼會改變?並削減世界的話?

的完整代碼:

void func(char *s) 
{ 
    char * p = strchr(s, ' '); 
    char * t = (char*)malloc(strlen(s) + 1); 

    if (!t) 
    { 
     printf("Memory allocated failed"); 
     exit(1); 
    } 
    *p++ = '\0'; 
    strcat(strcat(strcpy(t, p), " "), s); 
    strcpy(s, t); 
    free(t); 
} 
+1

你真的需要在這裏準確!否則無法理解你所看到的。之前應該是'p:'world''(帶領先的空格!) – grek40

+1

您的代碼不完整;特別是它似乎缺少'main()'函數和至少一個'#include'。請[編輯]你的代碼,這是你的問題[mcve],然後我們可以嘗試重現並解決它。你還應該閱讀[問]。 –

+0

請閱讀並理解[爲什麼不在C](/ q/605845)中投射'malloc()'和family的返回值的問題。 –

回答

2

分配給*p之前,您有以下:

+---+---+---+---+---+---+---+---+---+---+---+---+ 
s: |'H'|'e'|'l'|'l'|'o'|' '|'W'|'o'|'r'|'l'|'d'| 0 | 
    +---+---+---+---+---+---+---+---+---+---+---+---+ 
         ^
    +---+     |   
p: | | ----------------+ 
    +---+ 

執行*p++ = '\0';後,你有

+---+---+---+---+---+---+---+---+---+---+---+---+ 
s: |'H'|'e'|'l'|'l'|'o'| 0 |'W'|'o'|'r'|'l'|'d'| 0 | 
    +---+---+---+---+---+---+---+---+---+---+---+---+ 
          ^
    +---+      |   
p: | | --------------------+ 
    +---+ 

督察,你」已將s中的空格替換爲字符串終止符,這就是爲什麼當您打印s時只能看到"Hello"

+0

在'world'之後添加零結束符? – grek40

+1

@ grek40:完成。大腦比平時提前幾個小時醒來,大腦還沒有完成。 –

+0

這僅適用於類似於hello world的字符串,其中有一個空格。 – EsmaeelE