分页: 1 / 1
求助。新手编程,字符数组中元素对比出错
发表于 : 2014-11-11 21:34
由 tandkzy
代码: 全选
#include <stdio.h>
#include <string.h>
void trimr(char s[], unsigned int i);
void trimr(char s[], unsigned int l)
{
int length = strlen(s);
int i;
if(length >= l)
s[length - l] = '\0';
if( l == 0 )
{
for ( i = length - 1; i >= 0; i--)
{
printf("%d\n",i);
if(s[i] != ' ' || s[i] != '\t')
break;
}
s[i + 1] = '\0';
}
}
int main()
{
char s[] = "012345 6789 ";
printf("%s abcde\n",s);
trimr(s, 0);
printf("%s abcde\n",s);
return 0;
}
我想问下这个程序为什么在trimr处理数组s的时候无法对比成功。一开始对比就结束了。s的最后一个元素正好是数组的下标15,按照设计因为这个元素是空格,所以应该是不符合条件!=' '的。但是这里显然不正确。
另外,当把数组写成
的时候,编译无问题,但执行会出现段错误。试着用gdb试了下,错误好像出在trimr的语句
代码: 全选
s[length - l] = '\0';
执行后错误提示是段错误(核心已转储)。改用数组之后就没这个错误提示了。想问下这是为什么。
Re: 求助。新手编程,字符数组中元素对比出错
发表于 : 2014-11-11 22:40
由 xep007
不知道你要干什么?
1. 用char *s来定义的字符串是不可重写的。所以会提示段错误。
2. if(s != ' ' || s != '\t')
break;
如果s不为空,直接跳出for循环,然后执行 s[i + 1] = '\0';s之后就没了。
Re: 求助。新手编程,字符数组中元素对比出错
发表于 : 2014-11-12 11:09
由 astolia
逻辑关系没弄清楚。
if(s != ' ' || s != '\t')
这里要用&&。不会有s同时为' '和'\t',所以这个判断恒为真
Re: 求助。新手编程,字符数组中元素对比出错
发表于 : 2014-11-12 17:20
由 tandkzy
astolia 写了:逻辑关系没弄清楚。
if(s != ' ' || s != '\t')
这里要用&&。不会有s同时为' '和'\t',所以这个判断恒为真
感谢你。你说得对,这是个恒真的表达式。应该是与而不是或。
也感谢2楼的指点,即关于先前定义的方式串是不可必定的。
这函数的意思是消除串尾的空格。所以应该是既不等于空格也不等于制表符才跳出循环,而我搞错了逻辑运算表达了。