C语言(杂记)

C语言(杂记)

C/C++语言字符串与数字相互转换

https://www.cnblogs.com/sddai/p/5774121.html

浮点数

输入一个浮点数,保留两位小数,对第三位小数四舍五入。
思路:定义一个float类型的变量,从键盘上获取一个浮点数,将其乘以100再加0.5(这里加0.5是进行四舍五入)之后类型转换为整型,最后除以100.0(这里需要注意除数100得为一个小数,否则两个整数相除结果只保留整数部分),最终得到四舍五入的两位小数。

#include <stdio.h>
int main(){
	float num;
	printf("请输入一个浮点数:");
	scanf("%f",&num);
	num=(int)(num*100+0.5)/100.0;
	printf("%f",num);
	return 0;
}

浮点数转换为字符串

#include <stdio.h>
#include <string.h>
int main()
{
  float ff=1024.58;
  double dd=12345678901234.58;
  char strff[21],strdd[21];
 
  memset(strff,0,sizeof(strff)); memset(strdd,0,sizeof(strdd));
 
  // 把浮点数ff转换为字符串,存放在strff中。
  sprintf(strff,"%.2f",ff);
  printf("strff=%s\n",strff);  // 输出strff=1024.58
 
  // 把双精度浮点数dd转换为字符串,存放在strdd中。
  sprintf(strdd,"%.2lf",dd);
  printf("strdd=%s\n",strdd);  // 输出strdd=12345678901234.58
 
  memset(strff,0,sizeof(strff)); memset(strdd,0,sizeof(strdd));
 
  // 把浮点数ff转换为字符串,存放在strff中,只保留前10个字符。
  snprintf(strff,11,"%.2f",ff);
  printf("strff=%s\n",strff);  // 输出strff=1024.58
 
  // 把双精度浮点数dd转换为字符串,存放在strdd中,只保留前10个字符。
  snprintf(strdd,11,"%.2lf",dd);
  printf("strdd=%s\n",strdd);  // 输出strdd=1234567890
}

原文:https://www.jb51.net/article/231643.htm

字符串和浮点数格式化输出

一:字符串格式化

#include
int main()
{
    char buff1[] = "12345", buff2[] = "123456789012345";
 
    printf("buff1 = [%s], buff2 = [%s] ", buff1, buff2);
 
    //不足10位要保证10位长度,左补或右补空格,否则实数输出
    printf("    %%10s = [%10s]     [%10s] ", buff1, buff2);
    printf("   %%-10s = [%-10s]    [%-10s] ", buff1, buff2);
 
    //保证不超过10位,否则只取前10位(两者一样?记得上次看到好像不同样的嘛)
    printf("   %%.10s = [%.10s]    [%.10s] ", buff1, buff2);
    printf("  %%-.10s = [%-.10s]   [%-.10s] ", buff1, buff2);
 
    //保证一定输出10位,不足则左或右补空格,超出则只取前10位
    printf(" %%10.10s = [%10.10s]  [%10.10s] ", buff1, buff2);
    printf("%%-10.10s = [%-10.10s] [%-10.10s] ", buff1, buff2);
}
输出:
buff1 = [12345], buff2 = [123456789012345]
    %10s = [     12345]     [123456789012345]
   %-10s = [12345     ]    [123456789012345]
   %.10s = [12345]    [1234567890]
  %-.10s = [12345]   [1234567890]
 %10.10s = [     12345]  [1234567890]
%-10.10s = [12345     ] [1234567890]

所以一般使用%.10s或%-.10s来打印字符串比较好,左对齐,然后只可能输出最大固定长度的字符串。这样对于一个固定的报表格式来讲是比较合适的。

二:浮点数格式化

#include
int main()
{
    double d1 = 12345.235, d2 = 123456789012.345;
 
    printf("d1(%%f) = [%f], d2(%%f) = [%f] ", d1, d2);
 
    //只是保证只输出两位小数(两者一样,看来没必要用%-.2lf)
    printf("   %%.2lf = [%.2lf]    [%.2lf] ", d1, d2);
    printf("  %%-.2lf = [%-.2lf]   [%-.2lf] ", d1, d2);
 
    //保证输出至少10位,不足10位左或右补空格
    printf(" %%10.2lf = [%10.2lf]  [%10.2lf] ", d1, d2);
    printf("%%-10.2lf = [%-10.2lf] [%-10.2lf] ", d1, d2);
}
输出:
d1(%f) = [12345.235000], d2(%f) = [123456789012.345001]
   %.2lf = [12345.24]    [123456789012.35]
  %-.2lf = [12345.24]   [123456789012.35]
 %10.2lf = [  12345.24]  [123456789012.35]
%-10.2lf = [12345.24  ] [123456789012.35]

所以浮点数用%10.2lf来控制是不行的,因为它不能固定最大长度,一般实际应用中只用到金额的控制,所以后面一般用.2lf来控制两位小数(否则的话浮点数可能会输出6位小数)。而且控制至少10位的长度时有时会补空格,这会带来问题,如果一个表格要填金额,而如果这个制表函数控制了某种方式表示左对齐或右对齐,比如说右对齐(就是尽量靠表格的右边来显示数据),而你用%-10.2lf的输出话,那么输出的会用右空格来补齐10位以达到固定长度,那么其实在表格中就显示出左对齐来了。所以就会达不到作者想表达的意思。
所以最好的方式是不要输出空格补位,但又不能固定最大长度,只能固定最小长度,所以有个办法是先把浮点数转成字符串,再用字符串来格式化以达到固定最大长度的要求,如:

#include
int main()
{
    char buff1[20] = {0}, buff2[20] = {0};
    double d1 = 12345.235, d2 = 123456789012.345;
 
    snprintf(buff1, sizeof(buff1), "%.2lf", d1);
    snprintf(buff2, sizeof(buff2), "%.2lf", d2);
 
    printf("%%-.10s = [%-.10s]   [%-.10s] ", buff1, buff2);
}
输出:
%-.10s = [12345.24]   [1234567890]

当然,对于金额数据截断肯定不行,所以还是应该考虑使用最大可能的预留空间,比如20位空间来保证最大金额数。那样就只需用%.2lf来控制就行了。

贪心算法

贪心算法(greedy algorithm,又称贪婪算法)
https://blog.csdn.net/weixin_49370884/article/details/126247776

配置文件解析

一个服务配置文件是文本的,包含多个子服务配置。每个配置项由“;”号间隔。配置项第一个点前是子服务名称,请把配置项按不同子服务分别解析打印出来。不同配置项以换行\r\n分开。要求考虑配置项中可能存在不合法的配置,比如配置主键或者值没有写,要考虑过滤掉不合法的配置项,具有容错性。
https://blog.csdn.net/qq_27071221/article/details/126658071

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值