入门级 C语言期末复习(4)——字符串

上一篇文章:入门级 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;
}

要算二进制、八进制也是类似的,需要改动的只有判断进位的条件和进位后的处理上。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值