| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 457 人关注过本帖
标题:大家好,我在学习c语言,遇到一个问题不知道哪里出了毛病!请看内容!
只看楼主 加入收藏
erick8888
Rank: 1
等 级:新手上路
帖 子:11
专家分:3
注 册:2015-6-22
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:7 
大家好,我在学习c语言,遇到一个问题不知道哪里出了毛病!请看内容!
c语言教科书里面第三章有道题!我写了如下代码:
代码1是去掉转义字符
代码2是增加转义字符
在测试的时候 我用了字符串 char text1[50] = "\aHello,\\n\n\tWorld! Mistakee\b was \"Extra 'e'\"!\\n";
结果输出不正常了!!不知道错在哪里,请坛子里的大神给指点下啊!

代码1:
程序代码:
void escape(char *s,char *t){    
    int count = 0;
    while( *t != '\0') {      
        switch( *t ) {
            case '\n':
                *(s + (count++) ) = '\\';
                 *(s + count  ) = 'n';
                break;

            case '\t':
                *(s + (count++) ) ='\\';
                *(s + count  ) = 't';
                break;
            case '\b':
                *(s + (count++) ) = '\\';
                *(s + count ) = 'b';
                break;          
            case '\f':
                *(s + (count++) ) = '\\';
                *(s + count ) = 'f';
                break;            
            case '\r':
                *(s + (count++) ) = '\\';
                *(s + count ) = 'r';
                break;            
            case '\v':
                *(s + (count++) ) = '\\';
                *(s + count ) = 'v';
                break;            
            case '\\':
                *(s + (count++) ) = '\\';
                *(s + count ) = '\\';
                break;            
            case '\"':
                *(s + (count++) ) = '\\';
                *(s + count ) = '\"';
                break;            
            default:            
                /*  This is not a special character, so just copy it  */
                *(s + count ) = *t;
                break;
        }
        count++ ;
        t++;
    }

    *(s + count ) = *t ;

}


代码2:
程序代码:
void unescape(char *s,char *t ){
    
    int count = 0;

    while( *s != '\0') {

        switch( *s ) {

            case '\\':
                switch ( *(++s) ){
                    case 'n':
                        *(t + count ) = '\n';
                        break;

                    case 't':
                        *(t + count ) = '\t';
                        break;

                    case 'b':
                        *(t + count ) = '\b';
                        break;
                    case 'f':
                        *(t + count ) = '\f';
                        break;

                    case 'r':
                        *(t + count ) = '\r';
                        break;

                    case 'v':
                        *(t + count ) = '\v';
                        break;

                    case '\\':
                        *(t + count ) = '\\';
                        break;

                    case '\"':
                        *(t + count ) = '\"';
                        break;

                    default:
                        *(t + (count++) ) = '\\';
                        *(t + count ) = *s;
                        break;
                }
                break;

            
            default:
            
                /*  This is not a special character, so just copy it  */
                *(t + count ) = *s;
                break;
        }

        count++ ;
        s++;
    }

    *(t + count ) = *s ;

}


代码3 测试:
程序代码:
int main(){
   char *s= "12132343245235426546qefwqefasdfwefasfwefasdfaseqefq";
   char text1[50] = "\aHello,\\n\n\tWorld! Mistakee\b was \"Extra 'e'\"!\\n";
   char *text2 = "                                                           ";
   
   printf("%s\n",text1);   /* 输出源串*/
   escape( s,text1);
   printf("%s\n",s);    /* 输出取消转义字符之后的串*/
   unescape( s,text2);
   printf(" %s\n",text2);/* 输出增加转义字符之后的串*/


 getch();
    return 0;
}


[ 本帖最后由 erick8888 于 2015-6-23 14:46 编辑 ]
搜索更多相关主题的帖子: 教科书 字符串 c语言 
2015-06-22 22:39
erick8888
Rank: 1
等 级:新手上路
帖 子:11
专家分:3
注 册:2015-6-22
收藏
得分:0 
把测试代码改成

int main(){
   char *s= "12132343245235426546qefwqefasdfwefasfwefasdfaseqefq";
   char text1[50] = "\aHello,\\n\n\tWorld! Mistakee\b was \"Extra 'e'\"!\\n";
   char *text2="                                                    ";
   
   printf(" %s\n",text1);   /* 输出源串*/
   escape( s,text1);
   printf(" %s\n",s);    /* 输出取消转义字符之后的串*/
   unescape( s,text2);
   printf(" %s\n",text2);/* 输出增加转义字符之后的串*/

getch();
    return 0;
}


就可以正常输出了!很纳闷!
2015-06-23 14:46
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
我觉得转义字符这里 看看了解一下就行 不用抠的太细

DO IT YOURSELF !
2015-06-23 14:48
erick8888
Rank: 1
等 级:新手上路
帖 子:11
专家分:3
注 册:2015-6-22
收藏
得分:0 
回复 3楼 wp231957
我不是抠转义字符,是抠那个printf函数和字符串指针!
我感觉问题在这里,但是不懂!
2015-06-23 15:24
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
以下是引用erick8888在2015-6-23 15:24:49的发言:

我不是抠转义字符,是抠那个printf函数和字符串指针!
我感觉问题在这里,但是不懂!



printf函数可以选择性忽略了
字符串指针  你想玩啥呢

DO IT YOURSELF !
2015-06-23 15:26
erick8888
Rank: 1
等 级:新手上路
帖 子:11
专家分:3
注 册:2015-6-22
收藏
得分:0 
回复 5楼 wp231957
刚调试了下

改成如下代码,就可以正常输出了!

程序代码:
int main(){
   int v[]={1,2,3,4,5,6,7,8,9,10,12,12,12,32,33,43,54,656,7687};
   int i = 0;
   char *s= "12132343245235426546qefwqefasdfwefasfwefasdfaseqefq";
   char text1[50] = "\aHello,\\n\n\tWorld! Mistakee\b was \"Extra 'e'\"!\\n";
   char *text2= "12132343245235426546qefwqefasdfwefasfwefasdfaseqefq";
   
  printf("%s \n",text1);   /* 1 */
  escape( s,text1);
   printf("%s\n",s);
  unescape( s,text2);
  printf("\n");
  printf("%s\n",text2);


 getch();
    return 0;
}


注释为1的那句代码如果改成 printf("%s\n",text1); 就各种不正常了!

想知道原因!
2015-06-23 15:31
calix
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:28
帖 子:249
专家分:1442
注 册:2015-5-4
收藏
得分:20 
应该是
char *s= "12132343245235426546qefwqefasdfwefasfwefasdfaseqefq";
这里的问题,调用方法的时候可能出现越界的情况
你需要分配足够的空间,比如char s[100];就行了
2015-06-23 15:32
erick8888
Rank: 1
等 级:新手上路
帖 子:11
专家分:3
注 册:2015-6-22
收藏
得分:0 
回复 7楼 calix
谢谢指正 果然没错!是数组越界了!
2015-06-23 15:37
快速回复:大家好,我在学习c语言,遇到一个问题不知道哪里出了毛病!请看内容!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021028 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved