面试题--字符串指针与字符串数组的区别char* st="abc;与char* str[]="abc";的异同
2014-04-25 16:27
776 查看
题1. 删除串中指定的字符(做此题时,千万不要开辟新空间,否则面试官可能认为你不适合做嵌入式开发)
参考代码:
这是因为char *str = "abcdefgh";这里str指向的是常量字符串,str指向的内容是不能修改的,(str的值是可以修改的,比如再char s[10];str=s;是可以的),因此函数调用后对其指向的字符进行修改是错误的。
再看一个例子:
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;
}
}
参考代码:
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;
}
}
相关文章推荐
- 数组字符串与指针字符串的区别 char s[]="***" 和char *s="***"的区别
- char * 与 char [] 区别,char *[] 与 char[][]区别。字符串指针的数组与二维char数组区别。字符串常量赋予指针与字符数组区别。"字符串"等价于其首元素"字"的地址
- char *p="abc" 与 char p[]="abc" 的区别
- 指针与字符串:(const)char *p2 = "lmj";定义的是一个字符串常量!符串常量,正因为是常量,所以它内部的字符是不允许修改的。
- NSString与char*最大区别就是NSString是一个objective(父类)对象,而char*是一个有字节的数组。@+"字符串" 为objective-c NSString字符串常量的标准
- char *p="abc" 与 char p[]="abc" 的区别
- "显微镜"下细看字符串常量初始化数组和指针
- char a[](字符串数组)和char *a(字符串指针)区别
- 数组字符串与指针字符串的区别 char s[]="***" 和char *s="***"的区别
- char str[] = "hello world";和char *str = "hello world";区别
- 指向字符数组的指针 char*p="abc"和char p[]="abc"的区别。
- 给一个很长的字符串str 还有一个字符集比如"abc" 找出str 里包含"abc"的最短子串。要求O(n)
- char *Str;Str="abcdef";和char Str[]="abcdef";有什么区别??
- 指针和数组名的区别 char *str 和 char str[]的不同之处
- c++ 指针值和指针地址的输出&指针和数组保存字符串的区别
- String str="abc"和String str=new String("abc")的区别
- char *p="abc" 与 char p[]="abc" 的区别
- 给定数组 str[],循环左移m位。即如果str="ABCDEF",循环左移2位得到 "CDEFAB"
- String str = new String("abc")和String str = "abc"区别
- char str[] = "hello world";和char *str = "hello world";区别