1102412129 发表于 2020-5-28 14:38:32

寻找字符串中数字子串的最大值(包括小数)并打印【C语言】

具体题目如下:
主函数中输入一行字符串,内有数字字符和非数字字符,调用函数(自己定义及实现的函数)求该字符串中数字子串中最大的数字, 并在主函数中显示最大的数字。限定该字符串中数字子串最多不超过10个。如字符串“a123b345.6x876.1y76t”,该字符串中含有数字子串最大的数字是876.1#include <stdio.h>
#include <string.h>

int main(void)
{
    int i = 0, j = 0, n = 0;
    char str;
    float t = 0,max = 0;
    scanf("%s",str);

    for(i=0;i<strlen(str);i++)
    {
      if(str>='0' && str<='9')
      {
            n++;
            sscanf(str+i,"%f",&t);
            for(j=i+1;j<strlen(str);j++)
            {
                if(str>='0' && str<='9' || str == '.')
                  ;
                else
                  i = j-1;
            }
      }

      if(n==1)
            max = t;
      else
            max = (t>max?t:max);

    }

    printf("%g",max);

    return 0;
}


自己尝试了几次后,发现输出结果总是字符串中最先出现的数字子串,比如输入题目中的字符串,输出的是123而不是876.1
谢谢大家!

XFCoding 发表于 2020-5-28 16:04:49

问题1:n用完之后没有置为0(其实这里需要跳出循环而不是标记)
问题2:找到第一个数字之后没有跳出循环而是在内层循环把整个字符串读完了,所以你从头到尾只保存了第一个数字
void check(char *cc){
    int i = 0, j = 0;
    char *str = cc;
    float t = 0,max = 0;
    scanf("%s",str);
   
    for(i=0;i<strlen(str);i++)
    {
      if(str>='0' && str<='9')
      {
            sscanf(str+i,"%f",&t);
            for(j=i+1;j<strlen(str);j++)
            {
                if(!((str>='0' && str<='9') || (str == '.')))
                {
                  i = j-1;
                  goto CHANGE_MAX;
                }
            }
      }
      
    CHANGE_MAX:
            max = (t>max?t:max);
    }
    printf("%g",max);
}

java2python 发表于 2020-5-28 16:59:31

本帖最后由 java2python 于 2020-5-28 17:11 编辑

其实蛮麻烦的,看到C,头都炸。
strtod,就能折磨你。
再说:123.789.456,这类的,小数点不能读两个,那么。。。怎么算呢?
123.789,读到第二个小数点,只能是123.789,然后是从456开始,还是重新回到789开始?

sunrise085 发表于 2020-5-28 18:14:17

本帖最后由 sunrise085 于 2020-5-28 18:15 编辑

在你的程序基础上帮你修改了,也做好了注释。
#include <stdio.h>
#include <string.h>

int main(void)
{
    int i = 0, j = 0, flag = 0;
    char str;
    float t = 0,max = 0;
    scanf("%s",str);

    for(i=0;i<strlen(str);i++)
    {
      if(str>='0' && str<='9')
      {
            sscanf(str+i,"%f",&t);
            for(j=i+1;j<strlen(str);j++)
            {
                if(str == '.')//防止出现连续多个小数点的情况,例如a123b345.6x876.1.123456y76t
                  flag++;
                if((str>='0' && str<='9' || str == '.')&& flag<=1)
                  ;
                else
                  break;//for循环读完这个数字后应该break跳出循环
            }
            i=j;//这里不必是j-1,因为第j个肯定不是数字,下次循环从j+1开始即可,不必再查看第j个字符
            flag=0;
      }
      max = (t>max?t:max);//不必看是否是第一个数字,max初值为0肯定不会大于所找到的任何一个数字,直接判断就行了。

    }

    printf("%g",max);

    return 0;
}

1102412129 发表于 2020-6-2 21:50:20

XFCoding 发表于 2020-5-28 16:04
问题1:n用完之后没有置为0(其实这里需要跳出循环而不是标记)
问题2:找到第一个数字之后没有跳出循环而 ...

非常感谢!

1102412129 发表于 2020-6-2 21:51:09

sunrise085 发表于 2020-5-28 18:14
在你的程序基础上帮你修改了,也做好了注释。

非常感谢你鸭!
页: [1]
查看完整版本: 寻找字符串中数字子串的最大值(包括小数)并打印【C语言】