例7-11原题:输入一个以回车符为结束标志的字符串(少于80个字符),判断该字符串中心对称,如“abcba”、“abccba”是回文,“abcdba”不是回文。
在C语言中,字符串的存储和运算可以用一维字符数组来实现。数组长度取上限80,以回车符 ‘\n’ 作为输入结束符。
课本的源码及我的理解:
#include<stdio.h> innt main() { int i,k;//两个变量,一个从前移动,一个从后移动 char line[80];//定义字符串 printf("Enter a string: ");//输入提示 k=0; while((line[k]=getchar())!='\n')//输入的字符不是回车的时候 继续输入 k++;//这里可以数出字符串的有效长度 line[k]='\0';//否则结束,以 '\0'结尾 //判断字符串line是否为回文 //i 和 k 两个下标从字符串首尾两端同时向中间移动,逐对判断对应字符是否相等 i=0; k=k-1;//k是要从后面移动的 while(i<k)//一直移动,直到 i=k { if(line[i]!=line[k])//如果两个对应的字母不相等没必要继续了,循环结束跳到while外的语句 break; i++;//否则继续移动 k--; } if(i>=k)//若一直循环,说明对应的字母一直相等,也就是回文 printf("It is a pallindrome.\n"); else//根据条件,这里是从break语句接下来的 printf("It is not a pallindrome.\n"); return 0; }
我的解释有误请指出,谢谢!
既然都写了,顺带把一维字符数组也写了吧
定义一个有80个字符型元素的数组str:
char str[80];
字符型数组的初始化
char t[5]={'H','a','p','p','y'};
对静态数组s的前5个元素赋初值,其余元素的初值为0
static char s[6]={'H','a','p','p','y'};
static char s[6]={'H','a','p','p','y',0};
整数0代表字符 ‘\0’ ,所以上式还等价于
static char s[6]={'H','a','p','p','y','\0'};
同样的,如果对全部元素赋了初值,就可以省略数组长度,即:
static char s[]={'H','a','p','p','y','\0'};
上式的数组长度是6
可以用循环语句输出数组 t 的所有元素
for(i=0;i<5;i++) putchar(t[i]);
课本解释的字符串:
字符串:有效字符 和 字符串结束符 ‘\0’ 组成
例如:字符串 “Happy” 由6个字符组成,分别是 有效字符’H’, ‘a’, ‘p’, ‘p’, ‘y’ 和 字符串结束符’\0’
将字符串存入字符数组时,由于它有一个结束符 ‘\0’ ,数组长度 至少是字符串的有效长度+1.
字符串常量:用一对双引号括起来的字符序列
字符串的存储——一维数组初始化
static char s[6]={'H','a','p','p','y','\0'};
可以使用字符串常量,上式等价于:
static char s[6]={"Happy"};
static char s[6]="Happy";