以下C函数:
int sprintf ( char * str, const char * format, ... );
Run Code Online (Sandbox Code Playgroud)
将格式化数据写入字符串.作为str传递的数组的大小应该足以包含整个格式化的字符串.但是,如果格式化字符串的长度未提前知道怎么办?如何使用此函数(或类似其他函数)写入格式化数据,其长度未知?
例如:
#include <stdio.h>
int main ()
{
char buffer [13];
int n, a=5, b=3;
n=sprintf (buffer, "%d plus %d is %d", a, b, a+b);
printf ("[%s] is a %d char long string\n",buffer,n);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
缓冲区需要为13或更大才能使其正常工作.如果字符串长度未知,并且缓冲区(例如)已设置为5,则此操作无效.我需要能够为碰巧大于缓冲区的字符串动态分配或重新分配缓冲区的东西.
我需要在Windows中生成C中的随机GUID.我有:
HCRYPTPROV hCryptProv = 0;
BYTE pbBuffer[16];
int i;
if (!CryptAcquireContextW(&hCryptProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT | CRYPT_SILENT))
exit(1);
for (i = 0; i < N; i++) {
if (!CryptGenRandom(hCryptProv, 16, pbBuffer))
exit(1);
printf("%X%X%X%X-%X%X-%X%X-%X%X-%X%X%X%X%X%X\n", pbBuffer[0], pbBuffer[1], pbBuffer[2], pbBuffer[3],
pbBuffer[4], pbBuffer[5], pbBuffer[6], pbBuffer[7],
pbBuffer[8], pbBuffer[9], pbBuffer[10], pbBuffer[11],
pbBuffer[12], pbBuffer[13], pbBuffer[14], pbBuffer[15]);
}
Run Code Online (Sandbox Code Playgroud)
但是,这会将任何小于0F的字节打印为单个字符(例如,0000-00-00-00-000000如果每个字符pbBuffer[j]都是0).我需要打印每个字节为两个字符(例如,00000000-0000-0000-0000-000000000000如果每个字符pbBuffer[j]都是0).我怎样才能做到这一点?
main(a){printf(a="main(a){printf(a=%c%s%c,34,a,34);}",34,a,34);}
Run Code Online (Sandbox Code Playgroud)
编译后它是如何复制的?在printf函数中编写34的作用是什么?
我对在bash中打印包含新行符号的变量感到困惑.
var="Age:\n20\ncolor:\nred"
echo -e $var
Age:
20
color:
red
Run Code Online (Sandbox Code Playgroud)
这是有效的,但是很多人说使用选项的回声是不可移植的,并且最好使用printf.
我从来没用过prinf.根据手册发出echo命令:
printf '%s\n' "$var"
Age:\n20\ncoloe:\nred
Run Code Online (Sandbox Code Playgroud)
但是这并没有解析内部变量.手册通常有这个例子:
printf "Surname: %s\nName: %s\n" "$SURNAME" "$LASTNAME"
Run Code Online (Sandbox Code Playgroud)
但这不是我的情况,从我的观点来看,使用起来并不舒服.我只是通过键入我发现我可以使用它:
printf"$ var \n"
它是便携式的吗?如果我然后将$ var传递给邮件命令,它会保存新的换行符吗?
printf "$var\n" | mail -s subj email@domain.com
Run Code Online (Sandbox Code Playgroud) 我知道0在占位符的宽度之前放置任意数量的实现零填充.例如,printf("%02d", 6);打印06.
但是0在占位符的精度之前放一个单一的呢?例如,对于两个printf("%0.2lf", 0.123);和printf("%.2lf", 0.123);,输出0.12.
如果它什么都不做,是否有首选格式?
由于大量的搜索结果,我只发现了非常不相关的问题printf().
为什么不uint8_t指定自己的格式字符串,但任何其他类型呢?
据我所知printf(),它必须知道提供的参数的长度,以便能够解析变量参数列表.
由于uint8_t并uint16_t使用相同的格式说明符%u,"如何printf()"知道要处理多少字节?或者uint16_t在供应时是否存在隐含的演员uint8_t?
也许我错过了一些明显的东西.
编译器:来自Nuwen发行版的64位MinGW G ++ 4.9.1,在Windows 8.1下.
码:
#ifdef INCLUDE_IOSTREAM
# include <iostream>
#endif
#include <stdio.h> // ::snprintf
#include <stdlib.h> // EXIT_SUCCESS, EXIT_FAILURE
#include <stdexcept> // std::exception
#ifdef snprintf
# error snprintf defined as macro
#endif
#ifdef _MSC_VER
auto const snprintf = _snprintf;
#endif
void test( double const value, int const precision)
{
char buffer[34];
snprintf( buffer, sizeof( buffer ), "%.*a", precision, value );
printf( "Hex of %.3f with %2d digits: %s\n", value, precision, buffer );
}
auto main() -> int
{ …Run Code Online (Sandbox Code Playgroud) 当我使用下面的代码时:
#include <stdio.h>
int main(void)
{
printf("%s","Hello world\nHello world");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它打印为:
Hello world
Hello world
Run Code Online (Sandbox Code Playgroud)
如何防止这种情况并将其作为原始字符串文字在C中打印?我的意思是它应该显示在终端窗口中,如下所示:
Hello world\nHello world
Run Code Online (Sandbox Code Playgroud)
我知道我可以通过对printf使用反斜杠来实现这一点但是有没有其他C函数或方法来做到这一点没有反斜杠?阅读文件时会很有帮助.
我最近写了一个简单的程序来反转一个字符串,我的程序只是接受来自用户的输入字符串然后反转它.这一切都是用2个指针完成的.关于程序中的指针安全性,我编写了一个复制给定字符串的函数,该函数为新的(相同长度)字符串分配内存,然后逐个复制字符.
我的问题是当我运行这个程序时,虽然它做了我需要的东西,它打印出一些神秘的额外输出.在接受用户的输入之前,它每次都这样做.这是我运行程序时发生的情况.
C:\Users\0xEDD1E\Desktop\revstr>revstr.exe
[C]
[.]
[revstr.exe]
hello
[hello]
olleh
Run Code Online (Sandbox Code Playgroud)
这里最后三行是输入和输出,没关系,问题出在前3行
[C]
[.]
[revstr]
Run Code Online (Sandbox Code Playgroud)
那些是什么?无论如何,这是我的计划
#include <stdio.h>
#include <stdlib.h>
#define swap(a, b) (((a) ^ (b)) && ((a) ^= (b), (b) ^= (a), (a) ^= (b)))
unsigned long strlen_(char *);
char *strdup(char *s);
char *reverseString(char *, int);
int main(void)
{
//fflush(stdout);
char *str = (char *) malloc(1024 * sizeof (char));
scanf("%[^\n]s", str);
int slen = strlen_(str);
printf("%s\n", reverseString(str, slen));
return 0;
}
unsigned long strlen_(char *s)
{
char *p = s;
while …Run Code Online (Sandbox Code Playgroud) 我正在将文件类型数据读入一个bash数组,并需要在与空格相同的行上打印它的内容.
#!/bin/bash
filename=$1
declare -a myArray
readarray myArray < $1
echo "${myArray[@]}"
Run Code Online (Sandbox Code Playgroud)
我尝试这甚至与回声-n标志仍然打印在换行,我错过了什么,会更好地工作printf的?