标签: printf

printf还有其他选择吗?

我必须创建一个必须在几个*nix平台(Linux,AIX,...)上运行的软件.

我需要处理国际化,我的翻译字符串采用以下形式:

"Hi %1, you are %2." // English
"Vous êtes %2, bonjour %1 !" // French
Run Code Online (Sandbox Code Playgroud)

这里%1代表名称,%2换句话说.我可以改变格式,这不是问题.

我尝试使用printf()但你不能指定参数的顺序,你只需指定它们的类型.

"Hi %s, you are %s"
"Vous êtes %s, bonjour %s !"
Run Code Online (Sandbox Code Playgroud)

现在无法知道用于替换的参数%s:printf()只使用第一个参数,然后使用下一个参数.

有什么替代方案printf()吗?

注意:gettext()不是一个选项.

c c++ linux printf translation

21
推荐指数
4
解决办法
5275
查看次数

C中printf()的格式说明符%a

我正在阅读一本C语言书,它说的%f, %e, %g, %a是printf字符用于floatdouble数据类型.目前我%f, %e, %g完全可以理解.

我什么时候需要使用%a打印floatdouble输入数据?

你能告诉我一个例子吗?

c printf

21
推荐指数
2
解决办法
2万
查看次数

简单使用sprintf - C.

我试图弄清楚为什么会出现更大的问题,使用较小的程序作为例子.这个较小的程序不起作用,让我相信这是我对有缺陷的功能的理解.

据我所知,下面的程序应该初始化一个最多30个字符的字符串,然后将数字"5"取为9个有效数字,并将其转换为该字符串.然后程序应打印值"5.00000000".但是,程序打印值7.96788(...).为什么是这样?

#include <stdio.h>

int main()
{
    char word[30];
    sprintf(word, "%.9g", 5);
    printf(word);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c printf

21
推荐指数
1
解决办法
8万
查看次数

ObjectiveC的NSLog和Printf语句之间的区别

我想知道Objective-C中NSLogPrintf语句和语句之间的区别(用于应用程序......!)

为什么所有开发人员都使用NSLog而不是Printf

两者看起来相似,但内部工作有什么不同?

他们可以在哪个方面加以区分?

iphone printf objective-c nslog

21
推荐指数
3
解决办法
2万
查看次数

为什么gcc -Wall会给出关于零长度格式字符串的警告?

我搜索了一下这方面的信息,但没有找到任何令人满意的.函数调用是否有一些特殊的行为

sprintf(someString, "");
Run Code Online (Sandbox Code Playgroud)

这解释了为什么这是警告(在gcc上使用-Wall)?我只是发现C标准允许零长度格式字符串.

我尝试了以下示例

#include <stdio.h>

int main()
{
    char str[2] = {'a', 'a'};
    sprintf(str, "");
    printf("\'%c\'\'%c\'\n", str[0], str[1]);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

打印出来的

'''a'
Run Code Online (Sandbox Code Playgroud)

这正是我期望看到的.那么,为什么警告?

c printf gcc string-formatting gcc-warning

21
推荐指数
2
解决办法
1万
查看次数

使用printf打印UTF-8字符串 - 宽字符串与多字节字符串文字

在这些语句中,两者都使用相同的编码(UTF-8)输入到源代码中并且语言环境设置正确,它们之间是否存在实际差异?

printf("? ??????????? ?? ???? ?????\n");
printf("%ls", L"? ??????????? ?? ???? ?????\n");
Run Code Online (Sandbox Code Playgroud)

因此有什么理由在做输出时更喜欢一个而不是另一个?我想第二个表现得差一点,但是它对多字节文字有任何优势(或劣势)吗?

编辑:这些字符串打印没有问题.但是我没有使用宽字符串函数,因为我也希望能够使用printf等等.所以问题是打印任何不同的方式(鉴于上面列出的情况),如果是这样,第二个方法有任何优势吗?

编辑2:按照下面的评论,我现在知道这个程序有效 - 我认为这是不可能的:

int main()
{
    setlocale(LC_ALL, "");
    wprintf(L"? ??????????? ?? ???? ?????\n");  // wide output
    freopen(NULL, "w", stdout);                 // lets me switch
    printf("? ??????????? ?? ???? ?????\n");    // byte output
}
Run Code Online (Sandbox Code Playgroud)

EDIT3:我通过观察这两种类型的情况做了一些进一步的研究.拿一个更简单的字符串:

wchar_t *wides = L"£100 ?";
char *mbs = "£100 ?";
Run Code Online (Sandbox Code Playgroud)

编译器生成不同的代码.宽字符串是:

.string "\243"
.string ""
.string ""
.string "1"
.string ""
.string ""
.string "0"
.string ""
.string ""
.string …
Run Code Online (Sandbox Code Playgroud)

c unicode printf utf-8 multibyte

21
推荐指数
1
解决办法
6万
查看次数

如何在C中打印内存地址

我的代码是:

#include <stdio.h>
#include <string.h>

void main()
    {
    char string[10];
    int A = -73;
    unsigned int B = 31337;

    strcpy(string, "sample");

    // printing with different formats
    printf("[A] Dec: %d, Hex: %x, Unsigned: %u\n", A,A,A);
    printf("[B] Dec: %d, Hex: %x, Unsigned: %u\n", B,B,B);
    printf("[field width on B] 3: '%3u', 10: '%10u', '%08u'\n", B,B,B);

    // Example of unary address operator (dereferencing) and a %x
    // format string 
    printf("variable A is at address: %08x\n", &A);
Run Code Online (Sandbox Code Playgroud)

我在linux mint中使用终端编译,当我尝试使用gcc编译时,我收到以下错误消息:

basicStringFormatting.c: In function ‘main’:
basicStringFormatting.c:18:2: warning: …
Run Code Online (Sandbox Code Playgroud)

c printf pointers memory-address unary-operator

21
推荐指数
1
解决办法
6万
查看次数

C 中的 '\0' 和 printf()

在 C 的入门课程中,我了解到,在存储字符串时,存储的字符串\0末尾带有空字符。但是,如果我想打印一个字符串,尽管printf("hello")我发现它不\0以以下语句结尾,该怎么办

printf("%d", printf("hello"));

Output: 5
Run Code Online (Sandbox Code Playgroud)

但这似乎不一致,据我所知,像字符串这样的变量存储在主内存中,我猜在打印某些内容时它也可能存储在主内存中,那么为什么会有区别呢?

c printf stdout c-strings

21
推荐指数
5
解决办法
1983
查看次数

是sprintf(缓冲区,"%s [...]",缓冲区,[...])安全吗?

我看到使用这个模式连接到我正在处理的一些代码中的字符串:

sprintf(buffer, "%s <input type='file' name='%s' />\r\n", buffer, id);
sprintf(buffer, "%s</td>", buffer);
Run Code Online (Sandbox Code Playgroud)

而且我很确定它不安全C.你会注意到buffer它既是输出又是第一个输入.

除了缓冲区溢出的明显可能性之外,我相信不能保证缓冲区在函数的开始和结束之间不会发生变化(即,无法保证缓冲区的状态在执行功能).sprintf的签名还指定了目标字符串restrict.

我还记得一篇关于memcpy中的推测性写作的报告,我认为没有理由为什么某个C库可能在sprintf中做同样的事情.当然,在这种情况下,它会写入其来源.因此,这种行为是安全的?

仅供参考,我建议:

char *bufEnd = buffer + strlen(buffer);
/* sprintf returns the number of f'd and print'd into the s */
bufEnd += sprintf(bufEnd, " <input type='file' name='%s' />\r\n", id);
Run Code Online (Sandbox Code Playgroud)

替换这个.

c printf c-strings

20
推荐指数
2
解决办法
1万
查看次数

sprintf()的输入和输出字符串可以相同吗?

我在过去的代码中多次使用过这种类型的约定:

strcpy ( cTmpA, "hello" );
sprintf ( cTmpA, "%s world", cTmpA );
Run Code Online (Sandbox Code Playgroud)

最近我将我的遗留C编译器切换到Visual Studio 2005,发现我得到了一个由上面的代码产生的乱码.然后我想到,sprintf()的行为可能没有严格定义,其中一个输入与输出字符串匹配.

以上代码是否有效K&R C?如果没有,我如何找到我的代码中发生此类调用sprintf()的所有位置?

c printf

20
推荐指数
2
解决办法
8841
查看次数