在C字符串中可以使用哪些值?

在C字符串中可以使用哪些值?,c,C,我面临以下代码: char buf[100]; char buf2[100]; strcpy( buf, "áéíóúç" ); sprintf(buf2, "%s", buf); 我想知道这是否正确。我已经在Windows和Linux上测试过了,它确实可以工作,但是它能在所有不同语言的操作系统/平台上工作吗 strcpy和sprintf都需要以null字符结尾的C字符串,但C字符串的内容可以是任何内容(不包括null字符) 还可以执行以下操作吗: strcpy( buf, "\x0a\x09

我面临以下代码:

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);

这个问题已经存在,但是:


字符串函数仅在NULL字符处停止,因为c字符串的定义是以NULL结尾的字节缓冲区。因此,您的示例是正确的。

字符数组只是一个字节数组,所有非宽字符串函数都基于该假设进行操作。通常唯一具有特殊含义的字节是空字节

据我记忆所及,C标准在字符编码(或一般的文本)方面没有太多的内容,因此在预期输出字符编码与代码不匹配的平台上,程序注定会失败。

是的*


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

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

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


建议阅读:

几乎总是,您的代码可以正常工作

然而,我看到了两个可能的小问题:

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

    也许学习国际化和gettext等可能会有用