c字符数组之两头堵模型
- char *其实就是char[length]的首元素地址 实验环境:centos7下qt5.11 中文char类型占3个字节
char[length]="特别车队"其实等价于char *mywords="特别车队"
#include<stdio.h> #include<stdlib.h> #include<string.h> int main() { char * words=" 特别车队狮哥猴警官老狒 "; int i,j=0; j=strlen(words)-1; while(isspace(words[i]) && words[i]!='\0') { i++; } while(isspace(words[j]) && words[j]!='\0') { j--; } int n=j-i; printf("%d\n",n); while(i<=j){ printf("%c",words[i]); i++; } printf("\n%s\n",words); return 0; }
- 一个去除首尾空格的例子
#include<stdio.h> #include<stdlib.h> #include<string.h> int main() { char *wants=" 石锅拌饭和辣牛肉汤想吃了斯密达 "; int i,j=0; j=strlen(wants)-1; while(isspace(wants[i])) { i++; } while(isspace(wants[j])) { j--; } int n=j-i+1; char puluosimiga[1024]={0};//显示分配内存空间,在栈区,如果不做这步将无法复制字符 wants+=i; strncpy(puluosimiga,wants,n); puluosimiga[j]='\0'; printf("%d\n",n); printf("%s\n",puluosimiga); return 0; }
- 字符串逆序一切看似完美无缺实则已经出错
#include<stdio.h> #include<string.h> int main() { char *words=" plz check the number or you call again ";//造成问题的原因是,这样一来就生成了一个常量,其值不可修改 int lenofwords=strlen(words)-1; printf("%p\n",words); char *p=words+lenofwords; printf("%p\n",lenofwords); int i=0; while(words<p) { char temp=*words; *words=*p; *p=temp;
p--;
words++;
} printf("%s\n",words); return 0; }
- 解决办法,声明一个字符数组就相当于在栈上显示开辟了空间,其值即可修改
#include<stdio.h> #include<string.h> #include<locale.h> #include<stdlib.h> int main() { char mywords[]="spending my time,my time, my time"; char *p=mywords; char *q = p+strlen(mywords)-1; while(p<q) { char temp =*p; *p=*q; *q=temp; q--; p++; } printf("%s\n",mywords); return 0; }
输出结果:
- 利用递归函数的压栈和出栈特性----字符数组的每一个元素随着函数的调用压栈,函数执行完毕,层层返回是出栈,出栈时打印元素
#include<stdio.h> #include<string.h> #include<locale.h> #include<stdlib.h> void getnewords(char *p,char* dest) { if(p==NULL) { return; } if(*p=='\0') { return; } getnewords(p+1,dest+1); *dest=*p; printf("%c",*p); } int main() { char mywords[]="spending my time,my time, my time"; char *p=mywords; char mydest[1024]={0}; char *q=mydest; //memset(q,0,sizeof(mywords)); getnewords(p,q); printf("\n赋值后的数组%s",mydest); return 0; }
输出结果:
压栈的效果出来了,而我们期待的字符逆序输出并未实现,你能猜到为什么吗?
逆序打印出了字符,赋值是从后往前(目标数组的从后往前),而打印数组的值的时候是从前往后。
如何返回字符数组(字符串)逆序?解决方案------通过:strncat()函数完成数组连接
#include<stdio.h> #include<string.h> #include<locale.h> #include<stdlib.h> void getnewords(char *p,char* dest) { if(p==NULL) { return; } if(*p=='\0') { return; } getnewords(p+1,dest); strncat(dest,p,1); //printf("%c",*p); } int main() { char src[1024]="I don't like the drugs, but the drugs like me"; char dest[1024]={0}; printf("\nbefore:%s\n",dest); printf("\n%s\n","=================="); getnewords(src,dest); printf("\nfinally:%s\n",dest); return 0; }
输出结果: