我可以在C字符串中使用什么值?

时间:2012-02-14 18:57:34

标签: c

我面对以下代码:

char buf[100];
char buf2[100];
strcpy( buf, "áéíóúç" );
sprintf(buf2, "%s", buf);

我想知道它是否正确。我已经在Windows和Linux上测试过它确实有效,但它能在所有不同语言的操作系统/平台上运行吗?

strcpysprintf都需要一个以null字符结尾的C字符串,但C字符串的内容可以是任何内容(null字符除外) )?

也可以这样做:

strcpy( buf, "\x0a\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00" );
sprintf(buf2, "%s", buf);

5 个答案:

答案 0 :(得分:3)

char数组只是一个字节数组,所有非宽字符串函数都按照这个假设运行。通常唯一具有特殊含义的字节是空字节。

据我所知,C标准对字符编码(或一般文本)的主题没什么好说的,所以你的程序必然会在预期输出字符编码的平台上失败与您的代码不符。

答案 1 :(得分:2)

这个问题已经到位,但是:

字符串函数仅在NULL字符处停止,因为c-string的定义是以空字符结尾的字节缓冲区。所以你的例子还可以。

答案 2 :(得分:2)

char是机器中最小的可寻址单元。在你今天使用的任何东西上,它将是8位或一个字节。您可以在其中放置由8位整数表示的任何内容。

处理字符集时,集,每个字符使用16位(字符集中的字符)。在这种情况下,如果您没有意识到这一点并且缓冲区太小而无法保存数据,则会出现问题。

建议阅读:http://www.joelonsoftware.com/articles/Unicode.html

答案 3 :(得分:1)

是。 *

*)但请注意,第二个示例是一个字符短,\0字符表示字符串的结尾,因此不会打印。

答案 4 :(得分:1)

几乎总是,你的代码会起作用。

但是,我看到两个可能的小问题:

  1. 一些旧的C编译器可能不会接受ASCII之外的C源代码 - 或者奇怪的大型机上的EBCDIC - 字符(因此即使在字符串和注释中也可能不受欢迎,因此可能不受欢迎。)
  2. 即使在最近的Linux系统中,您也可以使用UTF8编码进行编译,但您的可执行文件将使用不同的编码(例如ISO8859-1)和本地化进行编译。
  3. 实际上,今天这些要点很小,因为最近的GCC编译器接受UTF8,而大多数Linux都是UTF8。我不会在实践中烦恼。

    或许可以了解国际化和gettext等。可能有用