K&Rc编程书第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("%sn", s);
   printf("%sn", t);
   unescape(t, m);
   printf("%sn", m);
}
void escape(char s[], char t[]){
   int i, j;
   for (i = j = 0; s[i] != '' ; 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] = '';
}
void unescape(char t[], char m[]){
   int i, j;
   for (i = j = 0; t[i] != ''; 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] = '';
}

好吧,我省略了所有注释,希望它足够简单,可以理解编译并运行它,我得到以下结果:

当我转义到真实字符时,最后怎么会得到多余的 n,n,t,t,同时制表符和换行符按预期工作?

回答

unescape函数break在 in中没有语句,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:永远不要忽略警告...


以上是K&amp;Rc编程书第2版,练习3-2,我写的一个细微的错误的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>