上一篇文章:入门级 C语言期末复习(3)——数组
字符串
在C语言中,没有专门的字符串类型,所以用字符数组来存储字符串。可以说字符串本质上是字符数组。上文所设计到的数组的操作对其也适用,在此基础上,有一些特别的使用方法,可以将其称为字符串与一般数组进行区分。
有关字符串的输入要加以区分,可以用scanf(“%s”,msg),注意msg前不需要“&”取地址符号,因为字符串名本身就是代表字符串首地址,这点与一般数组是一致的。这种输入遇到空格、tab、回车就会结束。如果要输入整行的字符串,有两种方法,一种是用循环的方法,用这种方法时要记得在末尾添加‘\0’,事实上,在进行类似字符串的增添、删减都最好在末尾加上‘\0’, 以免出错。令一种是用<string.h>库里的gets函数读入。输出与输入类似。
下面是一些例题
判断类型
其核心在于判断条件的合理使用。
最长的单词
对于这个题目,以字符串的形式输入句子。用一个for外循环来遍历字符串。用一个while内循环来数单词内的字母个数(while可以判断是否为字母,是字母就进入循环,字母数count++,不是字母就跳出循环。这里比较特别的一点是内外循环虽是嵌套,但是用的是同一个下标变量,也就是说遍历也是一次到头的,没有因为循环嵌套而重复。与其说嵌套,不如说并列,内循环数单词长度,外循环掠过非字母的字符。
在此之后用max与之比较,确定目前最长单词,并记录最长单词的位置,完成一个单词的记录后,要初始化count=0)。
最后得到了最长单词的结束位置和最长单词长度,可以用一个for循环输出最长单词。
#include <stdio.h>
#include <string.h>
int main()
{
int i,max=0,count=0,flag,len;
char msg[80];
gets(msg);
len=strlen(msg);
for (i=0;i<len;i++) //遍历整个字符串
{
count=0; //初始化单词长度
while (msg[i]>='A'&&msg[i]<='Z'||(msg[i]>='a'&&msg[i]<='z')) //判断是否是字母
{
count++; //单词长度加一
i++; //位置加一
}
if (max<count) //判断count所数的单词长度是否最大
{
max=count; //记录单词长度
flag=i; //记录单词结束位置
}
}
for (i=flag-max;i<flag;i++)
printf("%c",msg[i]);
return 0;
}
回文串的判断
写两个函数:main函数和判断是否为字符串的Palindrome函数。先判断原来的字符串是否为回文串,若是,直接输出Y,若不是,再逐一删去各个字母判断是否为回文串。
外层循环控制要删去第i个字母,内层循环将相应字母赋值给新的字符串。判断新字符串是否为回文串。
#include <stdio.h>
#include <string.h>
int palindrome(char msg[80]);
int main()
{
int i,j,len,flag=0;
char msg[80],b[80];
gets(msg);
flag=palindrome(msg); //判断原本的字符串是否为回文串
if (flag!=1) //若不是再去判断删去一个字母是否为回文串
{
len=strlen(msg);
for (i=0;i<len;i++) //逐一删去
{
for (j=0;j<len-1;j++) //第i个位置之前原样赋值,第i个位置后后一个值赋值给前一个值
{
if (j<i)
b[j]=msg[j];
else b[j]=msg[j+1];
}
b[len-1]='\0'; //非常关键的一步:要在字符串最后添上结束符,否则最后一个值会乱码,无法正常判断是否回文串
flag=palindrome(b); //判断删减字母后的字符串是否为回文串
if (flag==1)
break;
}
}
if (flag==1)
printf("Y");
else
printf("N");
return 0;
}
int palindrome(char msg[80])
{
int len,i,j,result;
char a[80];
len=strlen(msg);
msg[len]='\0'; //其实按照字符串的存储模式最后一个字符后是会自动添加'\0'的,我这里是为了强调
j=len-1;
for (i=0;i<len;i++)
{
a[j]=msg[i];
j--;
}
a[len]='\0'; //防止乱码
result=strcmp(a,msg);
if (result==0)
return 1;
else
return 0;
}
计算类型
现阶段主要是高精度加法及其变式的考查。
高精度加法
操作总是类似的,最核心的计算就是各位相加,逢十进一,实际上有很多种实现方法,我这里举了一种比较好理解,容易记得的方法供大家参考。
#include <stdio.h>
#include <string.h>
#define N 81
int main()
{
char s[N]={0};
int a[N]={0},b[N]={0},result[N]={0}; //初始化各位为0
int i,alen,blen,longer,resultlen,temp;
gets(s);
alen=strlen(s);
for(i=0;i<alen;i++)
{
a[i]=s[alen-1-i]-'0'; //将字符串元素逐位存入整型数组的同时调转字符串
}
gets(s);
blen=strlen(s);
for(i=0;i<blen;i++)
{
b[i]=s[blen-1-i]-'0'; //同上
}
longer=(alen>blen?alen:blen); //选择较长的数字的位数
for(i=0;i<longer;i++)
{
result[i]=a[i]+b[i]; //各位相加
}
for (i=0;i<longer;i++)
{
if(result[i]>9) //处理进位,逢十进一
{
result[i+1]++;
result[i]%=10;
}
}
resultlen=result[longer]==0?longer:longer+1;
for(i=resultlen-1;i>=0;i--)
{
printf("%d",result[i]); //逆序输出
}
return 0;
}
要算二进制、八进制也是类似的,需要改动的只有判断进位的条件和进位后的处理上。