2017-10-10 74 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