“回文”指的是一个字符串从前往后读和从后往前读都是一样的,则称这个字符串为回文。比如“qwerewq”是一个回文字符串,“gda534”则不是回文串。在数据结构中,可以通过使用“栈‘这种数据结构来实现,这里单从C语言的语法层面上来实现它。
#include<stdio.h>
#include<string.h>
#include<windows.h>
#include<assert.h>
#pragma warning(disable:4996)
//回文判断
//初始化字符串,其实这一步可以完全不要
#if 0
void init(char *array){
for (int i = 0; i < 100; i++){
array[i] = 0;
}
}
#endif
//先计算字符串的长度
//其实可以调用库函数
//自己实现也可以
int getStringSize(char *array){
int count = 0;
/*for (int i = 0; i < 100; i++){
if (array[i] != 0){
count++;
}
这种方法比较笨,需要遍历整个字符串
但是我们知道字符串后面都有一个‘\0’
那就不用整个的遍历整个字符串了
}*/
while (*array){
count++;
array++;
}
//也可以直接调用库函数,库函数也跟上面这么写的差不多
//但是更简单
//自己练习一下
return count;
}
int isPalin(char *array, int size){//判断是否回文串
//int count = getStringSize(*array);
//如果直接把字符串长度的参数带进来的话就不用再重新计算了
//如果没有带进来则需要重新计算,不过模块之间的耦合性还是要尽量低一点
//不然如果在这里计算字符串长度的话可能会改变指针array的指向,而后面还需要用到,
//需要提前把array保存或者复制
//有时候容易忘
assert(array); //如果需要对字符串检查
assert(size);//必须要求输入有效字符串,这可能对程序不利
/*
int left = 0;
int right = size-1;
while (left <= right){//从两端往中间检查
if (array[left] != array[right]){
return 0;
}
left++;
right--;
}*/
//也可以用指针完成
char *left = array;
char *right = left + size - 1;
while (left <= right){
if (*left == *right){
left++;
right--;
}
else{
return 0;
}
}
return 1;
}
int main(){
char string1[100];
//init(string1);
//printf("%s\n", string1);
printf("Please Enter your String:");
gets(string1);//从控制台输入字符串,包含空格
//printf("%s\n", string1);
//int count1 = getStringSize(string1);
if (isPalin(string1, getStringSize(string1))){
printf("yes!\n");
}
else{
printf("no!\n");
}
system("pause");
return 0;
}
这里需要明确一下,上面一会用下标引用的方式访问字符串,一会又用指针访问,其实指针也可以使用下标引用的方式:
比如array[i]也可以写成*array[i]//但是一般不这么写
两种方式都可以实现,那么这是不是一样的呢?也就是说指针和数组有什么关系呢?
答案是不一样,指针和数组没有关系。指针是指针,数组是数组,而这里需要引出一个概念:数组在进行参数传递时发生降维,降维为其内部类型的指针。而不是发生参数的值拷贝。而且只有数组传参时会发生降维
整型数组传参时降维为整型类型的指针int*
字符数组传参时降维为字符类型指针char*
。。。
所以有时候写函数的参数的时候有时候写成(int arr[])
有时候写成(int *arr),其实是一样的
上面的形参其实是个指针,不信可以做个测试:
#include<stdio.h>
int getsize(int arr[]){
return sizeof(arr);//在函数里看看数组多大
}
int main(){
int arr[]={1,2,3,4,5,6,7,8,9,0};
int size = sizeof(arr);//看arr[]占多大空间
int sizeof_arr = getsize(arr);//可以看看两个数是不是一样大
return 0;
}
这里只是说他们的引用方式是一样的,而数组和指针其实是没有关系的,要分清楚一点。至于为什么是这样以及更多的疑问以后有机会再说。这里只是为了不混淆。