C 如何连接字符串,但保持每个单独的空终止符?

C 如何连接字符串,但保持每个单独的空终止符?,c,string,C,String,首先,为了我的问题,我简化了这个函数。对于我的班级,我正在阅读一个基本上是一本成绩册的输入文件,我正在创建一个学生及其成绩的链接列表。无论如何,输入文件的顶部包含由空格分隔的4个类别。例如,“测验期中作业期末”是有效的。对于这个项目,我们可以假设每个类别最多15个字符(如果不计算空终止符,则为14个字符)。这就是我读取输入的方式 void printHeader(char *Category_Names) { printf("%s %s %s %s", Category_Names,(c

首先,为了我的问题,我简化了这个函数。对于我的班级,我正在阅读一个基本上是一本成绩册的输入文件,我正在创建一个学生及其成绩的链接列表。无论如何,输入文件的顶部包含由空格分隔的4个类别。例如,“测验期中作业期末”是有效的。对于这个项目,我们可以假设每个类别最多15个字符(如果不计算空终止符,则为14个字符)。这就是我读取输入的方式

void printHeader(char *Category_Names)
{
    printf("%s %s %s %s", Category_Names,(char*)Category_Names+15,(char*)Category_Names+30,(char*)Category_Names+45);
}
现在我已经了解了背景,我终于可以问我的问题了。如何将这些字符串串联,同时将null终止符保留在生成字符串的中间?显然,让这些空终止符基于printf调用中的参数是至关重要的。在有人建议我改变这种方法之前,我希望我能。这是我的教授提供的,如果由我决定,我肯定会用另一种方式。谢谢

如何将这些字符串串联,同时将null终止符保留在生成字符串的中间? 不可能在空字符后使用任何内容形成C字符串。字符串以
'\0'
结尾

而是使用
fwrite()

建议也用二进制文件打开该文件


但如果4个字符串缺少空格,则用另一种方法考虑空间的PAD输出。在我看来,用空字符填充是不可能使用的方法

void printHeader(char *Category_Names) {
  //  printf("%s %s %s %s", Category_Names,(char*)Category_Names+15, ...
  fwrite(Category_Names, 15, 4, stdout);
}
如何将这些字符串串联,同时将null终止符保留在生成字符串的中间? 不可能在空字符后使用任何内容形成C字符串。字符串以
'\0'
结尾

而是使用
fwrite()

建议也用二进制文件打开该文件


但如果4个字符串缺少空格,则用另一种方法考虑空间的PAD输出。在我看来,用空字符填充是不可能使用的方法

void printHeader(char *Category_Names) {
  //  printf("%s %s %s %s", Category_Names,(char*)Category_Names+15, ...
  fwrite(Category_Names, 15, 4, stdout);
}
测验\0\0\0\0\0\0\0\0\0\0\0中期考试

通常情况下,
strncat
的语义会使它相当混乱,但这正是它设计的初衷;可能的这是四个
'\0'
,在本例中除了提取字符串时方便之外,实际上不需要它们,因此还必须设置它们。做
struct{char s0[15],s1[15],s2[15],s3[15];}可能更容易,但也许你的教授不喜欢

printf("%14s %14s %14s %14s\n", 
  Category_Names, Category_Names+15,
  Category_Names+30, Category_Names+45);
#包括/*printf*/
#包括/*strncpy*/
#定义LEN 14
静态字符*str15cpy(字符*常量s1,常量字符*常量s2){
char*const ret=strncpy(s1,s2,LEN);
s1[LEN]='\0';
返回ret;
}
内部主(空){
char multistr[(LEN+1)*4];
char*s0=multistr,*s1=multistr+LEN+1,
*s2=multistr+(LEN+1)*2,*s3=multistr+(LEN+1)*3;
尺寸i;
str15cpy(s0,“测验”);
str15cpy(s1,中期);
str15cpy(s2,“家庭作业”);
str15cpy(s3,“最终版”);
/*这就是它在内存中的样子*/
对于(i=0;i<60;i++)
{const char a=multistr[i];printf(“%c”,a?a:'0');}
fputc('\n',stdout);
/*由于字符串已以“\0”结尾(方便),您可以*/
printf(“%s\t%s\t%s\t%s\t%s\n”,s0、s1、s2、s3);
返回0;
}
并使用具有固定长度记录的二进制I/O

测验\0\0\0\0\0\0\0\0\0\0\0中期考试

通常情况下,
strncat
的语义会使它相当混乱,但这正是它设计的初衷;可能的这是四个
'\0'
,在本例中除了提取字符串时方便之外,实际上不需要它们,因此还必须设置它们。做
struct{char s0[15],s1[15],s2[15],s3[15];}可能更容易,但也许你的教授不喜欢

printf("%14s %14s %14s %14s\n", 
  Category_Names, Category_Names+15,
  Category_Names+30, Category_Names+45);
#包括/*printf*/
#包括/*strncpy*/
#定义LEN 14
静态字符*str15cpy(字符*常量s1,常量字符*常量s2){
char*const ret=strncpy(s1,s2,LEN);
s1[LEN]='\0';
返回ret;
}
内部主(空){
char multistr[(LEN+1)*4];
char*s0=multistr,*s1=multistr+LEN+1,
*s2=multistr+(LEN+1)*2,*s3=multistr+(LEN+1)*3;
尺寸i;
str15cpy(s0,“测验”);
str15cpy(s1,中期);
str15cpy(s2,“家庭作业”);
str15cpy(s3,“最终版”);
/*这就是它在内存中的样子*/
对于(i=0;i<60;i++)
{const char a=multistr[i];printf(“%c”,a?a:'0');}
fputc('\n',stdout);
/*由于字符串已以“\0”结尾(方便),您可以*/
printf(“%s\t%s\t%s\t%s\t%s\n”,s0、s1、s2、s3);
返回0;
}

并使用具有固定长度记录的二进制I/O。

为什么不使用适当的字符串数组?您希望的输出是什么
Quizzes\0\0\0\0\0\0\0\0\0\0中期词汇…
Quizzes\0中期词汇…
?@johnymopp Quizzes\0\0\0\0\0中期词汇…您可以尝试以下方法:
char buf[60]={0};fscanf(文件,“%14s%14s%14s%14s%14s”、buf、&buf[15]、&buf[30]、&buf[45])
为什么不将整个60字节的
类别名称
数组(或将作为参数传递给
printHeader()
的数组)归零,然后将4个字符串读入数据中相应的偏移量。由于输入是空格分隔的,因此
%s
就可以了。请注意,
fscanf()
将愉快地阅读制表符和换行符以及单词之间的空格。如果所有内容都应该在一行中,请阅读该行(使用
fgets()
或POSIX
geline()
),然后使用
sscanf()
对其进行解析。请注意,您应该在
scanf()
调用中使用
%14s
;大小不包括空字节。为什么不使用适当的字符串数组?您希望的输出是什么<代码>测验\0\0\0\0\0\0\0\0\0\0中期词汇…
测验\0中期词汇…
?@JohnnyMopp测验\0\0\0\0\0中期词汇