面试题--字符串指针与字符串数组的区别char* st="abc;与char* str[]="abc";的异同

本文介绍了三种字符串操作的方法:删除指定字符、删除数字并压缩字符串、以及字符串逆序,所有操作均不使用额外空间,并通过示例代码详细解释了实现原理。

题1.   删除串中指定的字符(做此题时,千万不要开辟新空间,否则面试官可能认为你不适合做嵌入式开发)

参考代码:

void delChar(char* str, char c) 
{
int i, j=0;
int len=strlen(str);
 for(i=0; i<len; i++)
  if(str[i]!=c) 
	  str[j++]=str[i];
 str[j] = '\0';
}
void main(void)
 {
  char str[] = "abcdefgh"; // 注意,此处不能写成char *str = "abcdefgh";why??
  delChar(str, 'c'); 
  printf("%s\n", str);
}
关于这里为什么不能用char *str = "abcdefgh";用了程序编译没错,运行出错。

这是因为char *str = "abcdefgh";这里str指向的是常量字符串,str指向的内容是不能修改的,(str的值是可以修改的,比如再char s[10];str=s;是可以的),因此函数调用后对其指向的字符进行修改是错误的。

再看一个例子:

void stringCopy(char *from,char *to);
void main()
{

  //char a[] = "I am a teacher.";
 char b[] = "You are a student.";
  char *a = "I am a teacher.";      
//  char *b = "You are a student.";
  printf("a= %s\nb=%s\n",a,b);
  printf("copy string a to b :\n");
  stringCopy(a,b) ;                       //  实参是指针变量
  printf("a= %s\nb=%s\n",a,b);
}

// 子函数 实现两个字符串的复制

void stringCopy(char *from,char *to)     // 形参是指针变量
{
   
   for (;*from !='\0';from++,to++)
   {
	   *to = *from;
   }
   *to='\0';
}
这里

char *a = "I am a teacher.";      
char *b = "You are a student.";
a,b保存的是常量数据区地址,a,b指向的内容不能被修改
所以函数里面的赋值是不起作用的.
应该改成这样
char a[] = "I am a teacher.";      
char b[] = "You are a student.";
字符串传给字符数组,a,b保存的是栈区地址,这样传进函数就可以修改其内容了.

因为程序修改是数组b 的内容,所以这样也是可以的:

 char b[] = "You are a student.";
  char *a = "I am a teacher.";   

总结:char * 和char[]都可以用来表示字符串,但两者有很大的不同。其中最主要的不同就是char *所表示的字符串,是不能修改的,而char[]所表示的字符串是可以修改的。


题2:删除字符串中的数字并压缩字符串(神州数码以前笔试题),如字符串”abc123de4fg56”处理后变为”abcdefg”。注意空间和效率。


参考:(下面的算法只需要一次遍历,不需要开辟新空间,时间复杂度为O(N))

void DelNumberOfStr(char* str) 
{
int i, j=0;
int len=strlen(str);
 for(i=0; i<len; i++)
 {
if(str[i]>='0'&&str[i]<='9') 
  ; // continue;
else 
 str[j++]=str[i];
 }
 str[j] = '\0';
}

题3:不开辟用于交换数据的临时空间,如何完成字符串的逆序(在技术一轮面试中,有些面试官会这样问)

void change(char *str)
 {
      int len=strlen(str)
for(int i=0,j=len-1; i<j; i++, j--)
{
str[i]=str[i]^str[j];//a=a^b;
str[j]=str[i]^str[j];//b=a^b;
str[i]=str[i]^str[j];//a=a^b;
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值