c - K&R c编程书第2版,练习3-2,我写的一个细微的错误
问题描述
当我写练习3-2时,即转义字符和非转义字符:我遇到了一个微妙的问题,我想不通:
#include <stdio.h>
void escape(char s[], char t[]);
void unescape(char s[], char t[]);
int main(){
char s[] = "we can run all the \n \t \n \t \t programs on it";
char t[100];
char m[100];
int n = 0;
escape(s, t);
printf("%s\n", s);
printf("%s\n", t);
unescape(t, m);
printf("%s\n", m);
}
void escape(char s[], char t[]){
int i, j;
for (i = j = 0; s[i] != '\0' ; i++){
switch(s[i]){
case '\n':
t[j++] = '\\';
t[j++] = 'n';
break;
case '\t':
t[j++] = '\\';
t[j++] = 't';
break;
default:
t[j++] = s[i];
break;
}
}
t[j] = '\0';
}
void unescape(char t[], char m[]){
int i, j;
for (i = j = 0; t[i] != '\0'; i++){
switch(t[i]){
case '\\':
switch(t[++i]){
case 'n':
m[j++] = '\n';
break;
case 't':
m[j++] = '\t';
break;
default:
break;
}
default:
m[j++] = t[i];
break;
}
}
m[j] = '\0';
}
好吧,我忽略了所有的注释,希望它足够简单,可以理解编译并运行它,我得到以下结果:
最后,当我转义到真实字符时,我得到了多余的 n,n,t,t,同时制表符和换行符按预期工作,怎么办?
解决方案
该unescape
函数没有break
声明,case '\\':
因此它将落入default
.
我认为这就是为什么你会得到所谓的“冗余 n,n,t,t”
将其更改为:
switch(t[i]){
case '\\':
switch(t[++i]){
case 'n':
m[j++] = '\n';
break;
case 't':
m[j++] = '\t';
break;
default:
break;
}
break; // add this
你会得到另一个输出。
顺便说一句:使用适当的编译器标志,您的编译器会警告您这一点。
规则 1:永远不要忽略警告...
推荐阅读
- python - 我可以使用 YouTube Analytics API 找到我的 YouTube 频道的展示次数吗
- javascript - 如何将表单数据保存到文本文件?
- neo4j - 密码命令未被识别
- java - 如何在 Java 中通过 Selenium webdriver 选择 href 元素?
- javascript - 箭头函数和内存泄漏
- c++ - atomic_ref 当外部基础类型未按要求对齐时
- azure - Azure 认知搜索中的构面计数(自动)
- java - 从 Fragment Parent 按钮执行 ViewPager 中的 Fragment 的功能
- c++ - 删除尾随零 - C++
- javascript - 特定单元格周围的边框