这个问题类似于"从浮点数中删除尾随'.0',但对于Perl和小数点后的最大位数.
我正在寻找一种方法将数字转换为字符串格式,删除任何冗余的'0',包括不仅仅是在小数点后面.并且仍然具有最大数字数字,例如3
输入数据是浮点数.期望的输出:
0 -> 0
0.1 -> 0.1
0.11 -> 0.11
0.111 -> 0.111
0.1111111 -> 0.111
Run Code Online (Sandbox Code Playgroud) 我在这里错过了什么?这让我疯了!
我有一个返回const char*的函数
const char* Notation() const
{
char s[10];
int x=5;
sprintf(s, "%d", x);
return s;
}
Run Code Online (Sandbox Code Playgroud)
现在在代码的另一部分我这样做:
.....
.....
char str[50];
sprintf(str, "%s", Notation());
.....
.....
Run Code Online (Sandbox Code Playgroud)
但是str保持不变.
如果相反,我这样做:
.....
.....
char str[50];
str[0]=0;
strcat(str, Notation());
.....
.....
Run Code Online (Sandbox Code Playgroud)
str正确设置.
我想知道为什么sprintf不能按预期工作......
我Kernel#sprintf在Ruby中的方法上遇到了一些困惑.
Ruby 1.9以与Ruby 1.8不同的方式处理编码.
以下是我追求的结果,以及它在Ruby 1.8中的表现:
>> RUBY_VERSION
=> "1.8.7"
>> sprintf("%c", 88599)
=> "\027"
Run Code Online (Sandbox Code Playgroud)
这就是它在Ruby 1.9中的表现:
1.9.3p194 :001 > RUBY_VERSION
=> "1.9.3"
1.9.3p194 :002 > sprintf("%c", 88599)
=> "\u{15A17}"
Run Code Online (Sandbox Code Playgroud)
如果我使用魔术注释将编码设置为二进制(ascii-8bit),我会收到一个错误:
1.9.3p194 :001 > RUBY_VERSION
=> "1.9.3"
1.9.3p194 :002 > # encoding: binary
1.9.3p194 :003 > sprintf("%c", 88599)
RangeError: 88599 out of char range
from (irb):3:in `sprintf'
from (irb):3
from /Users/lisinge/.rvm/rubies/ruby-1.9.3-p194/bin/irb:16:in `<main>'
Run Code Online (Sandbox Code Playgroud)
我也尝试过使用Ruby 1.9.2,因此似乎没有特定于1.9.3.
也许我做错了什么?我对这种Kernel#sprintf方法并不熟悉.
我正在使用一个名为ruby-smpp的smpp库,它可以在github上找到.send_concat_mt当我试图在Ruby 1.9.3中运行它时,它就是第47行的方法.
如果你们中的任何人能够对这个问题有所了解,我将不胜感激.
据我所知,不纯函数是那些在使用相同参数调用时并不总是返回相同值的函数(我必须丢失一些东西,或者可能是错误的,如果我正确的话,请纠正我).
那么为什么被printf()认为是不纯的功能呢?
临时解决方法
我使用微小的printf解决了这个问题:
可能newlib printf占用了太多内存。此后,PC会更改一些奇怪的东西,从理论上讲,这应该是数组的结尾char[100]。
cp = buf + BUF
Run Code Online (Sandbox Code Playgroud)
稍后它尝试执行
*--cp = something
Run Code Online (Sandbox Code Playgroud)
它崩溃了。内存错误?有很多我不理解的事情。例如,我不确定链接描述文件是否正确,或者syscall函数是否正确。在获得进一步的了解之前,我必须坚持使用小巧的printf。
原版的
我有一个STM32F103RB板(Nucleo),而USART1才可以工作。另外,我测试了Newlib函数,并按puts()预期工作。但是,当我尝试printf()用于整数时,如下所示:
printf("ADC: %d\r\n", test);
Run Code Online (Sandbox Code Playgroud)
如果test < 10程序正常运行,但是test >= 10产生了严重故障。经过一些GDB调试后,我发现它是从vfprintf生成的:
#0 HardFault_Handler () at main.c:136
#1 <signal handler called>
#2 0x08005af4 in _vfprintf_r (data=<optimized out>, fp=0x20000384 <impure_data+852>, fmt0=fmt0@entry=0x20004f57 " \254\264", ap=...,
ap@entry=...) at ../../../../../../newlib/libc/stdio/vfprintf.c:1601
#3 0x08004fd0 in printf (fmt=0x800b4ac "ADC: %d\n\r") at ../../../../../../newlib/libc/stdio/printf.c:52
#4 0x080004e8 in main () at main.c:168
Run Code Online (Sandbox Code Playgroud)
我想不出任何解决方案。这是我的_sbrk():
caddr_t …Run Code Online (Sandbox Code Playgroud) 我想实现fmt::Display我的代码中常用的嵌套结构.
// The root structure
pub struct WhisperFile<'a> {
pub path: &'a str,
pub handle: RefCell<File>,
pub header: Header
}
pub struct Header{
pub metadata: metadata::Metadata,
pub archive_infos: Vec<archive_info::ArchiveInfo>
}
pub struct Metadata {
// SNIP
}
pub struct ArchiveInfo {
// SNIP
}
Run Code Online (Sandbox Code Playgroud)
如您所见,这是一个非平凡的数据树.当呈现为一行时,该archive_infos属性Header可以很长.
我想发布一些东西
WhisperFile ({PATH})
Metadata
...
ArchiveInfo (0)
...
ArchiveInfo (N)
...
Run Code Online (Sandbox Code Playgroud)
但是当我尝试显示时,Vec<ArchiveInfo>我得到的显示没有实现.我可以实现fmt::Display,ArchiveInfo但这还不够,因为fmt::Display没有为父容器实现Vec.如果我实现FMT ::显示collections::vec::Vec<ArchiveInfo>我得到the impl does not …
当我使用fprintf:
fprintf(somefile,"%c",'\n');
Run Code Online (Sandbox Code Playgroud)
它将"\ r \n"打印到文件中.我如何打印'\n'?
我正在写一个二进制文件.上面的代码仅用于调试.
我正在处理多个进程和信号,我昨天刚刚发现printf不是一个可重入的函数,因此将信号处理程序与信号处理程序一起使用存在风险.我能做些什么吗?是否有任何可重入的printf或任何可重入的系统调用可以取代printf?
谢谢!
我知道%%用于转义%字符串中的实际符号,因此%%%ds将以%10s下面的格式字符串结束,但我不知道为什么我需要%%5s在这个字符串中?
毕竟,只有两个额外的参数(BUFFSIZE/10).
#define BUFFSIZE 100
char buf[100]={0}
sprintf(buf, "%%5s %%%ds %%%ds", BUFFSIZE / 10, BUFFSIZE / 10);
Run Code Online (Sandbox Code Playgroud)
运行上面的代码后,buf将包含字符串,
%10s %10s
Run Code Online (Sandbox Code Playgroud)