所以,你有两个问题伪装成一个问题。
C 的格式化 I/O 例程(printf 和 fprintf)根本不像 Java 的 I/O 例程那样工作。您可以使用具有变量数据占位符的 格式字符串,而不是将项目连接到字符串,然后将变量数据作为附加参数传递:
printf( "The average score is %d\n", grade/2 );
%d 是一个转换说明符;它告诉printf,还有一个类型为int 的附加参数,并且它应该被格式化为数字序列。请注意,printf 依赖于格式字符串中的转换说明符来告诉它需要多少和哪些类型的附加参数;如果您传递的参数对于给定的转换说明符类型错误,或者没有传递足够的参数,那么您将得到从乱码输出到彻底崩溃的任何东西。如果您传递的参数多于格式字符串要求的参数,则评估附加参数,否则将被忽略。
请参阅方便的 C 参考手册,了解所有不同转换说明符及其使用方式的说明。
至于字符串连接,C 没有字符串类型本身,也没有字符串连接运算符1。在 C 中,“字符串”是由 0 值字节终止的字符值序列。字符串存储为char的数组,如:
char h[] = "hello";
char w[] = "world";
数组h 包含值{'h', 'e', 'l', 'l', 'o', 0},w 包含{'w', 'o', 'r', 'l', 'd', 0}。要将字符串连接在一起,您需要留出足够大的目标缓冲区以容纳两个字符串。如果你有一个支持变长数组的编译器,你可以这样做:
char result[ strlen(h) + strlen(w) + 2 ];
否则你将不得不动态分配内存:
char *result = malloc( sizeof *result * (strlen(h) + strlen(w) + 2) );
+ 2 是“hello”和“world”之间的空格以及终止 0 字节所必需的。
一旦有了目标缓冲区,就可以使用strcpy 和strcat 的组合来写入:
strcpy( result, h );
strcat( result, " " ); // note " " instead of ' '; the second argument *must* be a string
strcat( result, w );
或者您可以使用sprintf(其工作方式类似于printf,但将结果写入char 的数组而不是流):
sprintf( result, "%s %s", h, w );
要使strcat 工作,目标缓冲区中必须已经有一个有效的以0 结尾的字符串,这就是我们以strcpy 开头的原因,它将在复制的字符串的末尾附加一个0 字节。一个空字符串包含一个 0 值字节,所以我们也可以这样做:
result[0] = 0; // or memset( result, 0, sizeof result ), which sets the whole buffer to 0
strcat( result, h );
strcat( result, " " );
strcat( result, w );
strcat 查找终止的 0 字节,并用下一个字符串的开头覆盖它,然后在结果的末尾附加一个 0 字节。
1。彼此相邻的字符串
literals 在编译的预处理阶段被连接起来,所以你可以写类似
printf( "start of string " A_STRING_MACRO " end of string\n"); 的东西,在预处理之后它看起来像 `printf("start of string 不管是在 string\n" 的宏末尾),但没有运行时连接运算符。