c - 如何连接字符串但保留每个单独的空终止符?
问题描述
void printHeader(char *Category_Names)
{
printf("%s %s %s %s", Category_Names,(char*)Category_Names+15,(char*)Category_Names+30,(char*)Category_Names+45);
}
首先,为了我的问题,我已经简化了这个功能。对于我的班级,我正在阅读一个本质上是成绩册的输入文件,并且我正在创建一个学生及其成绩的链接列表。无论如何,输入文件的顶部包含 4 个由空格分隔的类别。例如,“Quizzes Midterms Homework Final”是有效的。对于这个项目,我们可以假设每个类别最多 15 个字符(如果不计算空终止符,则为 14 个)。这就是我阅读输入的方式。
fscanf(file, "%15s %15s %15s %15[^\n]s%*c", category1, category2, category3, category4);
现在我已经了解了背景,我终于可以问我的问题了。如何连接这些字符串,同时将空终止符保留在结果字符串的中间?显然,根据 printf 调用中的参数使用这些空终止符至关重要。在有人建议我改变这种方法之前,我希望我能做到。这是我的教授提供的,如果由我决定,我肯定会以不同的方式来做。谢谢
解决方案
测验\0\0\0\0\0\0\0\0期中...
通常,strncat
渲染它的语义相当混乱,但这正是它的设计目的;可能的历史。'\0'
在这种情况下实际上不需要四个,除非在提取字符串时方便,因此还必须设置这些。这可能更容易做到struct { char s0[15], s1[15], s2[15], s3[15]; };
,但也许你的教授不喜欢那样做。
#include <stdio.h> /* printf */
#include <string.h> /* strncpy */
#define LEN 14
static char *str15cpy(char *const s1, const char *const s2) {
char *const ret = strncpy(s1, s2, LEN);
s1[LEN] = '\0';
return ret;
}
int main(void) {
char multistr[(LEN + 1) * 4];
char *s0 = multistr, *s1 = multistr + LEN + 1,
*s2 = multistr + (LEN + 1) * 2, *s3 = multistr + (LEN + 1) * 3;
size_t i;
str15cpy(s0, "quizzes");
str15cpy(s1, "midterms");
str15cpy(s2, "homework");
str15cpy(s3, "final");
/* This is what it looks like in memory. */
for(i = 0; i < 60; i++)
{ const char a = multistr[i]; printf("%c", a ? a : '0'); }
fputc('\n', stdout);
/* Since the strings are '\0' terminated (convenient) already, you can, */
printf("%s\t%s\t%s\t%s\n", s0, s1, s2, s3);
return 0;
}
并使用具有固定长度记录的二进制 I/O。
推荐阅读
- amazon-dynamodb - VelocityTemplate,生成开始和结束日期之间的日期列表
- docker - 为什么容器在 CMD ( docker ) 中启动后不启动?
- javascript - 消息:未初始化的字符串偏移量:0,同时插入动态输入字段数据
- python - 我们如何以及为什么使用时间分布层包裹的 CNN 层?
- angular - 在 Angular 中按顺序运行一组 http 调用
- node.js - NodeJs 是否使用“根目录”?
- css - 原生基卡高度未调整
- android - 如何使您的父母可点击但孩子不可点击?
- swift - 我不知道为什么我不能从以下网址下载这张图片:http://upload.wikimedia.org/wikipedia/de/d/d2/Juventus_Turin.svg
- mongodb - 如何在 mongoDB 集合字段中保存大型 html 内容(文章)?