我必须创建一个必须在几个*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语言书,它说的%f, %e, %g, %a是printf字符用于float和double数据类型.目前我%f, %e, %g完全可以理解.
我什么时候需要使用%a打印float和double输入数据?
你能告诉我一个例子吗?
我试图弄清楚为什么会出现更大的问题,使用较小的程序作为例子.这个较小的程序不起作用,让我相信这是我对有缺陷的功能的理解.
据我所知,下面的程序应该初始化一个最多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) 我想知道Objective-C中NSLog的Printf语句和语句之间的区别(用于应用程序......!)
为什么所有开发人员都使用NSLog而不是Printf?
两者看起来相似,但内部工作有什么不同?
他们可以在哪个方面加以区分?
我搜索了一下这方面的信息,但没有找到任何令人满意的.函数调用是否有一些特殊的行为
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)
这正是我期望看到的.那么,为什么警告?
在这些语句中,两者都使用相同的编码(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) 我的代码是:
#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 的入门课程中,我了解到,在存储字符串时,存储的字符串\0末尾带有空字符。但是,如果我想打印一个字符串,尽管printf("hello")我发现它不\0以以下语句结尾,该怎么办
printf("%d", printf("hello"));
Output: 5
Run Code Online (Sandbox Code Playgroud)
但这似乎不一致,据我所知,像字符串这样的变量存储在主内存中,我猜在打印某些内容时它也可能存储在主内存中,那么为什么会有区别呢?
我看到使用这个模式连接到我正在处理的一些代码中的字符串:
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)
替换这个.
我在过去的代码中多次使用过这种类型的约定:
strcpy ( cTmpA, "hello" );
sprintf ( cTmpA, "%s world", cTmpA );
Run Code Online (Sandbox Code Playgroud)
最近我将我的遗留C编译器切换到Visual Studio 2005,发现我得到了一个由上面的代码产生的乱码.然后我想到,sprintf()的行为可能没有严格定义,其中一个输入与输出字符串匹配.
以上代码是否有效K&R C?如果没有,我如何找到我的代码中发生此类调用sprintf()的所有位置?