2012-09-21 81 views
0
void slice_first_char(char ** string) 
{ 
    *string = &(*string[1]); 
} 

int main(int argc, char * argv[]) 
{ 
    char * input = "abc"; 
    input = &(input[1]); 
    puts(input); // "bc" as expected. 

    slice_first_char(&input); 
    puts(input); // \372\277_\377 
       // What‘s going on? 
} 

如何重写slice_first_char函数使其按预期工作?以C开头的字符串切片

+1

你为什么不解释你期望它做什么,然后也许我们可以解决如何做到这一点? –

+0

@NVI你可以编写一个自定义的substr()函数来提取 – cc4re

+0

我根本不知道C,但为了好玩即时猜测。删除“&”,使它变成'slice_first_char(input)'。即时通讯猜测你通过引用传递参考,而不是参考字符串? – Lee

回答

11

您在

&(*string[1]); 

错了括号。我猜你的意思

&((*string)[1]); 

你的原始版本取消引用strings数组的第一个元素的指针,然后充分利用了地址,而实际上要取消引用给定的指针(因为它只是指向一个单一的字符串),然后取第一个元素(第一个字符),然后取这个地址。

略为少convul​​ated的方式来表达,这将是

*string + 1 

的方式。

+0

+1:完成这项工作,当插入问题中的程序时,首先生成“bc”,然后生成“c”。 –

+0

谢谢!花了一个小时,没有注意到它。 – NVI

+0

虽然这个表示法很麻烦。取消引用,然后再次访问该地址?建议指针算术。 – singpolyma

3

您似乎试图从字符串中删除第一个字符。所以:

char* remove_first_char(const char* s) { 
    return (s+1); 
} 
+1

并像这样使用它:'input = remove_first_char(input);',我假设。看起来更简单。 – NVI

+1

或者如果你想成为:'return * s? s + 1:s;' –