指针;“未使用计算的值”;在c函数中

指针;“未使用计算的值”;在c函数中,c,pointers,gcc,C,Pointers,Gcc,我编写了一个函数,可以按要求的长度缩短字符串(单词的句子)。我不希望句子的开头恰好在一个单词的中间。所以我向后跳过n个字符,直到我到达一个空格,并在那里剪切句子字符串。 我的问题并不是真正的问题,编译我的函数时会发出一条警告:“警告:未使用计算的值”,请参阅代码中的注释行。不过,该函数按预期工作。 所以,要么我是瞎子,要么我在我的项目上坐得太久,实际上我不理解这个警告。有人能告诉我函数中的缺陷吗 char * str_cut(char *s, size_t len) { char *p

我编写了一个函数,可以按要求的长度缩短字符串(单词的句子)。我不希望句子的开头恰好在一个单词的中间。所以我向后跳过n个字符,直到我到达一个空格,并在那里剪切句子字符串。 我的问题并不是真正的问题,编译我的函数时会发出一条警告:“警告:未使用计算的值”,请参阅代码中的注释行。不过,该函数按预期工作。 所以,要么我是瞎子,要么我在我的项目上坐得太久,实际上我不理解这个警告。有人能告诉我函数中的缺陷吗


char *
str_cut(char *s, size_t len) {
    char *p = NULL;
    int n = 3;

    p = s + len;
    if (p < (s + strlen (s))) {
        /*
         * do not cut string in middle of a word.
         * if cut-point is no space, reducue string until space reached ...
         */
        if (*p != ' ')
            while (*p != ' ')
                *p--;   // TODO: triggers warning: warning: value computed is not used

        /* add space for dots and extra space, terminate string */
        p += n + 1;
        *p = '\0';

        /* append dots */
        while (n-- && (--p > s))
            *p = '.';
    }
    return s;
}


煤焦*
短切(字符、大小、长度){
char*p=NULL;
int n=3;
p=s+len;
如果(p<(s+strlen))){
/*
*不要在一个单词的中间剪切字符串。
*若切割点并没有空间,则缩小字符串,直到达到空间。。。
*/
如果(*p!='')
而(*p!='')
*p-->//TODO:触发器警告:警告:未使用计算的值
/*为点添加空格和额外空格,终止字符串*/
p+=n+1;
*p='\0';
/*添加点*/
而(n--&(-p>s))
*p=';
}
返回s;
}
我在开发机器上的编译器是“gcc版本4.2.4(Ubuntu 4.2.4-1ubuntu4)”

*p--
*(p--)
相同


计算减量,然后取消引用减量的结果。事实上,你并没有对这个结果做任何事情,因此发出了警告。如果你只是说
*p

你这样做只是为了副作用,你也会得到同样的警告

            *p--;
  • 副作用:减量p
  • 表达式的值:p指向的值

编译器警告您未使用表达式的值:-)

警告是由于
*
(取消引用)--您没有在任何地方使用取消引用的值。只要做到:

p--;

警告应该消失。

为什么要使用if-then呢?(只是好奇)另外,它应该检查该循环中的
p>s
(就像在第二个循环中一样)。@Blam:因为它是Alpha代码,还没有真正干净。是的,不需要“如果”。谢谢:-)@lars:是的,谢谢你,我刚刚加了这个!谢天谢地,编译器实际上在抱怨^^^。真的!这就是为什么我在开发过程中总是使用带有编译命令的“-Wall”开关!我知道这很简单:-)。。。对不起,我应该自己检查一下,有时因为有很多树,所以很难看到福勒斯特……注意:递减的结果是指针的原始值。我最近忘记了这一点。将
char*p
替换为
char**p
,并将
p++
更改为
*p++
;我期待着
(*p)+
,但这个回答让我明白了。最后为了清楚起见,更改为
*p=*p+1