C语言基础:头歌作业题(字符串统计)

1.题目描述

输入一段字符(由空格、字母和数字几种组成,保证开头不为空格),里面有若干个字符串,求这些字符串的长度和,并输出最长字符串内容,如果有多个输出最先出现的那个字符串。以stop作为最后输入的字符串。

输入

输入一段字符,以stop作为最后输入的字符串。

样例输入:

My name is Amy

My name is Jane

stop

样例输出:

11 name

12 name

题目大家应该都能读懂把,就是输入比如My name is Amy

My2个字符+name4个字符+is2个字符+Amy3个字符=11个字符

name最长且是第一个出现的,所以打印出来

你再输入stop时,结束循环了。

最后调试的结果如下

代码如下:

方法一:

#include<string.h>
int main()
{
    int i, length;
    char str[100];
    int j = 0;//记录最长字符后的那一个空格所在的下标
    while (1)//一直要输入字符,不知道结束,
    {
        gets(str);
        int a = 0;//用来记录总的字符数
        int b = 0;//用来记录每个单词的字母数
        int max = 0;//记录最长单词字母数,刚开始没有输入字符,就是0;
        length = strlen(str);
        if (strcmp(str, "stop") == 0)
        {
            break;//输入stop时,跳出循环
        }
        else
        {
            for (i = 0; i <= length; i++)
            {
                if (str[i] != ' ' && str[i] != '\0')
                {
                    a++;
                    b++;
                }
                //遇到空格,前后两个字符串的分开
                if (str[i] == ' ' || str[i] == '\0')
                {
                    if (b > max)//b统计好了每个字符串数,轮流与max对比
                    {
                        max = b, j = i;//j=i,把最长字符串后的那个空格的下标给j;
                    }
                    b = 0;
                }

            }
        }
        printf("%d ", a);
        for (i = j - max; i < j; i++)//i=j-max就是最长字符串第一个字符的下标
        {
            printf("%c", str[i]);
        }
        printf("\n");
    }

    return 0;
}

strcmp函数:(判断两个字符串是否相等)

strcmp函数的比较规则是按照字典序进行比较,即逐个字符比较。具体的比较过程如下:

  1. 若str1小于str2,则返回负整数,即小于0的数。
  2. 若str1和str2相等,则返回0。
  3. 若str1大于str2,则返回正整数,即大于0的数。
#include<string.h>
int main(void)

{
    int ret,a;
    char str_1[] = "abc";

    char str_2[] = "abc";

    char str_3[] = "abC";
    ret = strcmp(str_1, str_2);
    a = strcmp(str_2, str_3);
    printf("%d\n", ret);
    printf("%d", a);
    return 0;

}

ret=0,因为两个字符串相等,a=1,因为c的ASCII码 比C大,返回1;

方法二:(难理解)(后面学到了再讲)

#include<string.h>
int main(void)
{
    char arr1[1000];
    char arr2[1000];
    fgets(arr1, 1000, stdin);
    for (;;) {
        if (strncmp(arr1, "stop", 4) == 0 && arr1[4] == '\n')
            break;

        int sum = 0, maxlen = 0;
        char* p;
        p = strtok(arr1, " \t\n");
        while (p) {
            int len = strlen(p);
            if (len > maxlen) {
                maxlen = len;
                strcpy(arr2, p);
            }
            sum += len;

            p = strtok(NULL, " \t\n");
        }

        printf("%d %s\n", sum, arr2);

        fgets(arr1, 1000, stdin);
    }
    return 0;
}

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值