请考虑以下事项:
#include <stdio.h>
main() {
unsigned long long verybig = 285212672;
printf("Without variable : %llu\n", 285212672);
printf("With variable : %llu", verybig);
}
Run Code Online (Sandbox Code Playgroud)
这是上述程序的输出:
Without variable : 18035667472744448
With variable : 285212672
Run Code Online (Sandbox Code Playgroud)
从上面可以看到,当printf将数字作为常量传递时,它会输出一些巨大的错误数字,但是当该值首次存储在变量中时,会printf输出正确的数字.
这背后的原因是什么?
numCheck是1-1000之间的数字.只有当我在charcheck中收集sprintf的结果时,此代码才会给我一个段错误.如果我只是在不使用结果的情况下使用sprintf,我就不会遇到seg错误.这里发生了什么事?
char * numString;
int charcheck = sprintf(numString, "%d", numCheck);
Run Code Online (Sandbox Code Playgroud) 我想打印以下散列数据.我该怎么办?
unsigned char hashedChars[32];
SHA256((const unsigned char*)data.c_str(),
data.length(),
hashedChars);
printf("hashedChars: %X\n", hashedChars); // doesn't seem to work??
Run Code Online (Sandbox Code Playgroud) 假设我的C程序中有以下代码:
#include <stdio.h>
void PrintSomeMessage( char *p );
int main(int argc, char *argv[]) {
char arr[10] = "hello";
PrintSomeMessage(&arr[0]);
return 0;
}
void PrintSomeMessage(char *p)
{
printf("p: %s",p);
}
Run Code Online (Sandbox Code Playgroud)
为什么输出这个单词"hello"而不是单个字符"h"?
但我明白,如果我"%c"在格式化程序中添加一个,它只会打印一个字母.但是,此地址中每个字母的内存地址不同.请有人向我解释一下吗?
可变参数模板在c ++ 11中引入.我发现可以使用它替换printf函数.但是,cout用于实现.我想知道是否有可能使用其他东西来实现类型安全但不牺牲太多性能.
void safe_printf(const char *s)
{
while (*s) {
if (*s == '%') {
if (*(s + 1) == '%') {
++s;
}
else {
throw "invalid format string: missing arguments";
}
}
std::cout << *s++;
}
}
template<typename T, typename... Args>
void safe_printf(const char *s, T& value, Args... args)
{
while (*s) {
if (*s == '%') {
if (*(s + 1) == '%') {
++s;
}
else {
std::cout << value;
safe_printf(s + 1, args...); // …Run Code Online (Sandbox Code Playgroud) 所以我才知道我们可以在main函数中给出两个参数,即"argc"和"argv.但是我无法理解argv在这里是什么:
int main(int argc, char* argv[]);
argv是一个字符数组?还是指向字符的指针数组?无论哪种方式,我正在寻找一种方法来打印出用户传递给该程序的参数.这是我写的代码,但它不是打印argv的.这有什么不对?我想这是我对argv的理解,这使得这段代码不正确.
#include<stdio.h>
int main(int argc, char *argv[])
{
int i;
printf("%d\n",argc);
for(i=0;i<argc-1;i++)
{
printf("%s",*argv[i]);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
根据我从答案得到的建议后,我更正了我的代码如下.
#include<stdio.h>
int main(int argc, char *argv[])
{
int i;
printf("%d\n",argc);
for(i=1;i<argc;i++)
{
printf("%s",argv[i]);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我在Windows 8.1上使用VMWare中的Ubuntu Linux.这是我得到的输出.它只是打印argc,之后什么都没有.有什么问题?这是我在Linux终端中编译它的方式吗?
在上图中,我希望再次打印数字2,4,5,3,但它们不会被打印出来.
谢谢.
正如其他人所讨论的那样,GLSL缺乏任何类型的printf调试.但有时我真的想在调试着色器时检查数值.
我一直在尝试创建一个可视化调试工具.我发现如果使用sampler2D其中数字0123456789已经在等宽度中渲染的数据,可以在着色器中相当容易地渲染任意数字系列.基本上,你只是玩弄你的x坐标.
现在,要使用它来检查浮点数,我需要一个算法将a转换float
为十进制数字序列,例如您可能在任何printf实现中找到.不幸的是,据我所知这个主题,这些算法似乎需要以更高精度的格式重新表示浮点数,我不知道这似乎有可能在GLSL中我似乎有只有32位float可用.出于这个原因,我认为这个问题不是任何一般的"printf如何工作"问题的重复,而是具体关于如何使这些算法在GLSL的约束下工作.我已经看到了这个问题和答案,但不知道那里发生了什么.
我尝试过的算法并不是很好.我的第一次尝试,标记为版本A(注释掉)似乎非常糟糕:采取三个随机的例子,RenderDecimal(1.0)渲染为1.099999702,RenderDecimal(2.5)给了我,
2.599999246然后RenderDecimal(2.6)出来了2.699999280.我的第二次尝试,标志着版本B,似乎略胜一筹:1.0与2.6两者出来罚款,但RenderDecimal(2.5)仍然不匹配的一个明显的凑整5的事实,剩余的是0.099....结果显示为2.599000022.
我的最小/完整/可验证的例子,下面,从一些简短的GLSL 1.20代码开始,然后我碰巧选择了Python 2.x,只是为了编译着色器并加载和渲染纹理.它需要pygame,numpy,PyOpenGL和PIL第三方软件包.请注意,Python实际上只是样板,并且可以通过C或其他任何东西重写(尽管繁琐).只有顶部的GLSL代码对于这个问题至关重要,因此我不认为这些python或python 2.x标签会有所帮助.
它需要将以下图像保存为digits.png:

vertexShaderSource = """\
varying vec2 vFragCoordinate;
void main(void)
{
vFragCoordinate = gl_Vertex.xy;
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}
"""
fragmentShaderSource = """\
varying vec2 vFragCoordinate;
uniform …Run Code Online (Sandbox Code Playgroud) 我编写了一个 Raku 脚本来调用erfC 标准库中的函数:
use NativeCall;
sub erf(num64) returns num64 is native { * };
say [0.5,1,2,3,4,-0.9].map: {erf($_.Num)};
Run Code Online (Sandbox Code Playgroud)
该脚本的输出
(0.5204998778130465 0.8427007929497149 0.9953222650189527 0.9999779095030014 0.9999999845827421 -0.7969082124228322)
Run Code Online (Sandbox Code Playgroud)
[0.5,1,2,3,4,-0.9]除 之外的所有值都与 C 的输出匹配4。
对于4C 输出,1.000000而 Raku 给出0.9999999845827421。
要测试 C 语言的输出4,请运行以下代码:
#include <stdio.h> // Including header file for printf function
#include <math.h> // Including header file for erf function
int main (){
double param, result;
param = 4.0;
result = erf(param);
printf("erf …Run Code Online (Sandbox Code Playgroud) 我刚刚发现 C 编译器有非常奇怪的行为。这是非常简单的代码。我在很多在线C编译器中尝试过,但结果总是一样的,这让我抓狂。
#include <stdio.h>
int main()
{
char Buffer[10] = "0123456789";
char ID[5] = "abcde";
printf("%s",ID);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
花点时间尝试预测函数的结果printf。如果你是像我一样的人,那么我认为最明显的解决方案是“abcde”,这是不正确的!但如果你以某种方式算出了“abcde0123456789”,那么你就在消耗电力来生活。
怎么、怎么可能?我只选择ID要打印的数组,那么为什么Buffer也用它打印呢?这没有道理。即使ID数组也不够大,无法容纳所有数据。我真的要失去理智了。
我很好奇:
如果你做了printf("%f", number);什么是声明的精确度?即会出现多少小数位?这个编译器是否依赖?