我将在C中编写一个程序,它将字符串t重写为s变量,并将新行,制表等字符转换为控制序列,如\ n,\ t。接下来,我需要编写一个执行反向操作的函数 - 将控制序列转换为正确的字符。
这是我的代码:
#include <stdio.h>
#define LIMIT 50
void escape(char * s, const char * t);
void bumpInto(char * s, const char * t);
int main(void) {
const char s1[LIMIT] = "Ala\nma\tkota.";
char s2[LIMIT];
char s3[LIMIT];
printf("%s\n", s1);
escape(s2, s1);
printf("%s\n", s2);
bumpInto(s3, s2);
printf("%s\n", s3);
return 0;
}
void escape(char * s, const char * t) {
while (*t) {
switch (*t) {
case '\n':
*s = '\\';
++s;
*s = 'n';
break;
case '\t':
*s = '\\';
++s;
*s = 't';
break;
default:
*s = *t;
break;
}
++s;
++t;
}
}
void bumpInto(char * s, const char * t) {
char prev = 0;
while (*t) {
if (prev == '\\') {
switch (*t) {
case 'n':
--s;
*s = '\n';
break;
case 't':
--s;
*s = '\t';
break;
}
}
// if (prev != '\\' && *t != '\\')
*s = *t;
putchar(*s);
prev = *t;
++s;
++t;
}
}
我有结果:
Alanmatkota.@
而非预期:
Ala
ma kota.
我遇到写入bumpInto函数的问题,该函数执行与转义相反的操作,特别是将控制序列转换为正确的字符。任何人都可以提出建议吗?
答案 0 :(得分:1)
您正在重写您的控制字符:
*s = *t;
每次都会执行。只需添加其他内容:
void bumpInto(char * s, const char * t) {
char prev = 0;
while (*t) {
if (prev == '\\') {
switch (*t) {
case 'n':
--s;
*s = '\n';
break;
case 't':
--s;
*s = '\t';
break;
}
}else
*s = *t;
putchar(*s);
prev = *t;
++s;
++t;
}
*s = *t; // add null terminator '/0'
}
是的,你没有处理字符串的空终止符。