求助。新手编程,字符数组中元素对比出错

软件和网站开发以及相关技术探讨
回复
tandkzy
帖子: 512
注册时间: 2006-02-12 19:29

求助。新手编程,字符数组中元素对比出错

#1

帖子 tandkzy » 2014-11-11 21:34

代码: 全选

#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,按照设计因为这个元素是空格,所以应该是不符合条件!=' '的。但是这里显然不正确。
另外,当把数组写成

代码: 全选

char *s = "xxxxx"
的时候,编译无问题,但执行会出现段错误。试着用gdb试了下,错误好像出在trimr的语句

代码: 全选

s[length - l] = '\0';
执行后错误提示是段错误(核心已转储)。改用数组之后就没这个错误提示了。想问下这是为什么。
xep007
帖子: 871
注册时间: 2006-01-03 20:44

Re: 求助。新手编程,字符数组中元素对比出错

#2

帖子 xep007 » 2014-11-11 22:40

不知道你要干什么?
1. 用char *s来定义的字符串是不可重写的。所以会提示段错误。
2. if(s != ' ' || s != '\t')
break;
如果s不为空,直接跳出for循环,然后执行 s[i + 1] = '\0';s之后就没了。
头像
astolia
论坛版主
帖子: 6443
注册时间: 2008-09-18 13:11

Re: 求助。新手编程,字符数组中元素对比出错

#3

帖子 astolia » 2014-11-12 11:09

逻辑关系没弄清楚。
if(s != ' ' || s != '\t')
这里要用&&。不会有s同时为' '和'\t',所以这个判断恒为真
tandkzy
帖子: 512
注册时间: 2006-02-12 19:29

Re: 求助。新手编程,字符数组中元素对比出错

#4

帖子 tandkzy » 2014-11-12 17:20

astolia 写了:逻辑关系没弄清楚。
if(s != ' ' || s != '\t')
这里要用&&。不会有s同时为' '和'\t',所以这个判断恒为真


感谢你。你说得对,这是个恒真的表达式。应该是与而不是或。
也感谢2楼的指点,即关于先前定义的方式串是不可必定的。
这函数的意思是消除串尾的空格。所以应该是既不等于空格也不等于制表符才跳出循环,而我搞错了逻辑运算表达了。
回复