鱼C论坛

 找回密码
 立即注册
查看: 2284|回复: 5

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

[复制链接]
发表于 2020-5-28 14:38:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

  3. int main(void)
  4. {
  5.     int i = 0, j = 0, n = 0;
  6.     char str[100];
  7.     float t = 0,max = 0;
  8.     scanf("%s",str);

  9.     for(i=0;i<strlen(str);i++)
  10.     {
  11.         if(str[i]>='0' && str[i]<='9')
  12.         {
  13.             n++;
  14.             sscanf(str+i,"%f",&t);
  15.             for(j=i+1;j<strlen(str);j++)
  16.             {
  17.                 if(str[j]>='0' && str[j]<='9' || str[j] == '.')
  18.                     ;
  19.                 else
  20.                     i = j-1;
  21.             }
  22.         }

  23.         if(n==1)
  24.             max = t;
  25.         else
  26.             max = (t>max?t:max);

  27.     }

  28.     printf("%g",max);

  29.     return 0;
  30. }
复制代码


自己尝试了几次后,发现输出结果总是字符串中最先出现的数字子串,比如输入题目中的字符串,输出的是123而不是876.1
谢谢大家!
最佳答案
2020-5-28 18:14:17
本帖最后由 sunrise085 于 2020-5-28 18:15 编辑

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

  3. int main(void)
  4. {
  5.     int i = 0, j = 0, flag = 0;
  6.     char str[100];
  7.     float t = 0,max = 0;
  8.     scanf("%s",str);

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

  27.     }

  28.     printf("%g",max);

  29.     return 0;
  30. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-5-28 16:04:49 | 显示全部楼层
问题1:n用完之后没有置为0(其实这里需要跳出循环而不是标记)
问题2:找到第一个数字之后没有跳出循环而是在内层循环把整个字符串读完了,所以你从头到尾只保存了第一个数字
  1. void check(char *cc){
  2.     int i = 0, j = 0;
  3.     char *str = cc;
  4.     float t = 0,max = 0;
  5.     scanf("%s",str);
  6.    
  7.     for(i=0;i<strlen(str);i++)
  8.     {
  9.         if(str[i]>='0' && str[i]<='9')
  10.         {
  11.             sscanf(str+i,"%f",&t);
  12.             for(j=i+1;j<strlen(str);j++)
  13.             {
  14.                 if(!((str[j]>='0' && str[j]<='9') || (str[j] == '.')))
  15.                 {
  16.                     i = j-1;
  17.                     goto CHANGE_MAX;
  18.                 }
  19.             }
  20.         }
  21.         
  22.     CHANGE_MAX:
  23.             max = (t>max?t:max);
  24.     }
  25.     printf("%g",max);
  26. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-5-28 16:59:31 | 显示全部楼层
本帖最后由 java2python 于 2020-5-28 17:11 编辑

其实蛮麻烦的,看到C,头都炸。
strtod,就能折磨你。
再说:123.789.456,这类的,小数点不能读两个,那么。。。怎么算呢?
123.789,读到第二个小数点,只能是123.789,然后是从456开始,还是重新回到789开始?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-5-28 18:14:17 | 显示全部楼层    本楼为最佳答案   
本帖最后由 sunrise085 于 2020-5-28 18:15 编辑

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

  3. int main(void)
  4. {
  5.     int i = 0, j = 0, flag = 0;
  6.     char str[100];
  7.     float t = 0,max = 0;
  8.     scanf("%s",str);

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

  27.     }

  28.     printf("%g",max);

  29.     return 0;
  30. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

非常感谢!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-2 21:51:09 | 显示全部楼层
sunrise085 发表于 2020-5-28 18:14
在你的程序基础上帮你修改了,也做好了注释。

非常感谢你鸭!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-13 09:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表