我面对以下代码:
char buf[100];
char buf2[100];
strcpy( buf, "áéíóúç" );
sprintf(buf2, "%s", buf);
我想知道它是否正确。我已经在Windows和Linux上测试过它确实有效,但它能在所有不同语言的操作系统/平台上运行吗?
strcpy
和sprintf
都需要一个以null
字符结尾的C字符串,但C字符串的内容可以是任何内容(null
字符除外) )?
也可以这样做:
strcpy( buf, "\x0a\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00" );
sprintf(buf2, "%s", buf);
答案 0 :(得分:3)
char数组只是一个字节数组,所有非宽字符串函数都按照这个假设运行。通常唯一具有特殊含义的字节是空字节。
据我所知,C标准对字符编码(或一般文本)的主题没什么好说的,所以你的程序必然会在预期输出字符编码的平台上失败与您的代码不符。
答案 1 :(得分:2)
这个问题已经到位,但是:
字符串函数仅在NULL字符处停止,因为c-string的定义是以空字符结尾的字节缓冲区。所以你的例子还可以。
答案 2 :(得分:2)
char
是机器中最小的可寻址单元。在你今天使用的任何东西上,它将是8位或一个字节。您可以在其中放置由8位整数表示的任何内容。
处理字符集时,是集,每个字符使用16位(字符集中的字符)。在这种情况下,如果您没有意识到这一点并且缓冲区太小而无法保存数据,则会出现问题。
答案 3 :(得分:1)
是。 *
*)但请注意,第二个示例是一个字符短,\0
字符表示字符串的结尾,因此不会打印。
答案 4 :(得分:1)
几乎总是,你的代码会起作用。
但是,我看到两个可能的小问题:
实际上,今天这些要点很小,因为最近的GCC编译器接受UTF8,而大多数Linux都是UTF8。我不会在实践中烦恼。
或许可以了解国际化和gettext
等。可能有用