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