精华内容
下载资源
问答
  • 都说西藏是一种病,对于一个c程序员来说,我觉得乱码大赛的经典之作也是一种病,不把他完全理解通透总是不自在。至少对于我来说,是这样的。前前后后这是第三次看这份代码,第一次时候刚在学校学完C语言,只是下载到...

    都说西藏是一种病,对于一个c程序员来说,我觉得乱码大赛的经典之作也是一种病,不把他完全理解通透总是不自在。至少对于我来说,是这样的。前前后后这是第三次看这份代码,第一次时候刚在学校学完C语言,只是下载到运行了一把,想看懂。结果看了一会。一脸懵逼的放弃。第二次拿起他,分析了一部分,只是简单的把每个三目运算符对号入座了一下。又放弃了。怂在了他69K+次递归和2.3K+次输出。这次,再次拿起这份代码。也想检验一下自己的逻辑能力。切入正题,开始分析这令我叹为观止的递归。
    首先上第一道菜,这基本是没改动的原版,只是把其中一点不符合现在编程语法这类的东西做了修改,至于原版,网上多的是。

    #include <stdio.h>
    main(int t,int _,char* a)
    {
        return !0<t?t<3?main(-79,-13,a+main(-87,1-_, 
    main(-86,0,a+1)+a)):1,t<_?main(t+1,_,a):3,main(-94,-27+t,a)&&t==2?_<13? 
    main(2,_+1,"%s %d %d\n"):9:16:t<0?t<-72?main(_,t, 
    "@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/") 
    :t<-50?_==*a?putchar(a[31]):main(-65,_,a+1):main((*a=='/')+t,_,a+1) 
    :0<t?main(2,2,"%s"):*a=='/'||main(0,main(-61,*a, 
    "!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry"),a+1);
    }

    这副样子一眼看过去是很头疼的,我们先来简单处理一下,把其中的字符串取出来,顺便把A?B:C语句用缩进来整理下,对于短的直接放到一行,也容易看,对于长的,我采用下面这种格式:

        A? //每个字母表示一个表达式
        (
            B
        ):
        (
            C?
            (
                D
            ):
            ()
        )

    上代码

    #include <stdio.h> 
    char *p1 = "%s %d %d\n";
    char *p2 = "@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,\
    /n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/\
    +k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){nl]!\
    /n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w\
    {%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c ;;{nl'-{}rw]'/+,}##'*}#nc,',\
    #nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/";
    char *p3 = "!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry";
    
    main(int t,int _,char* a)
    {
        return  1 < t ? //!0就是真值,即 1 ,这里为了不迷惑,直接写成1
                (
                    (
                        (t < 3?
                            main(-79,-13,a+main(-87,1-_, main(-86,0,a+1)+a)):1
                        ),
                        (t<_?
                            main(t+1,_,a):3),
                            main(-94,-27+t,a)
                    )&&
                    (   (
                            (t==2?
                                (
                                    _<13? main(2,_+1,p1):9
                                ):
                                16
                            )
                        )
                    )
                ):
                (
                    t<0 ?
                    (
                        t<-72?
                        (
                            main(_,t,p2)
                        ):
                        (
                            t<-50?
                            (
                                _==*a?putchar(a[31]):main(-65,_,a+1)
                            ):
                            main((*a=='/')+t,_,a+1)
                        )       
                    ):
                    (
                        0<t?
                            main(2,2,"%s"):*a=='/'||main(0,main(-61,*a,p3),a+1)
                    )
                );
    }

    现在,至少看起来容易点了,但是实际的运行,也就是递归过程,还是一脸懵逼态。
    接下来开始一步步分析,看程序是怎么递归的。
    可以看到main带了三个参数,这是合法的,具体什么意思自行百度。这不是我们今天的重点。第一次进入时候不需要关注第三个参数,第一二个参数值分别是 1, 1. 开始判断

    1. 1 < 1不成立,跳到第33行,1 < 0 不成立,跳到第48行,0 < 1 成立,调用main(2,2,“%s”)
    2. 1 < 2成立, 跳到16行, 2 < 3 成立, 顺次进去调用 main(-86,0,a+1)
    3. 1 < -86不成立,跳到33行,-86 <0成立,跳到35行,-86 < -72成立,调用main(_,t,p2),即main(0,-86,p2)
    4. 1 < 0不成立,跳到33行, 0 < 0不成立,跳到48行,0 < 0不成立,判断*a == ‘/’,*a即p2[0],不成立,所以执行 || 后面的 main(-61,*a,p3) 接下来不具体说了直接说相应的行。这次递归跳到42行 后面的main,每次调用这个main p3加1,直到_==*a 即p2[0] == *a,也就是匹配到p3中第一个和p2[0]相等的字符,就输出这个字符后第31个字符
      至此,终于把第一个字符分析出来了。
      这里有一个重点地方,第一个是*a ==’/’ ||根据程序偷懒规则,当前面为真,或后面的不执行直接返回结果。所以仔细一分析可以看出,程序每次以“/”作为分割,顺次输出每段字符(哪些段后面说)。

      第二个就是 _==*a?putchar(a[31]):main(-65,_,a+1),当_==a[0]时候,程序会输出一个字符,简单分析一下不难发现,这里的两个字符引自的字符串是固定的,_恒为p2,此处的a[0]恒为p3,也就是说,输出字符来自p3,顺序来自p2,我们写个简单的程序,把p3字符按照p2规定的顺序输出,并且以 ‘/’ 分割开。
      第三,控制程序跳转循环的是第一第二个参数,控制程序输出的是第三个参数,记住这些,我们后面会用到
      这是我的写好的代码

      
      #include <stdio.h>
      
      
      #include <stdlib.h>
      
      
      #include <string.h>
      
      char *p2 = "@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,\
      /n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/\
      +k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){nl]!\
      /n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w\
      {%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/";
      char *p3 = "!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry";
      int main()
      {
      int i = 0,j  = 0,len = -1;
      len = strlen(p3);
      while(*(p2+i) != '\0')
      {
          if(*(p2+i) == '/')
          {
              printf("\n");
              i++;
              continue;
          }
          for(j = 0;j < len;j++)
          {
              if(p3[j] == *(p2+i))
              {
                  printf("%c",p3[31+j]);
                  break;
              }
          }
          i++;
      }
      return 0;
      }
      

      这里写图片描述
      结合上面两点重要信息,这里就是这段代码的27条 ‘短语’(为了描述方面,姑且这么叫吧)
      再来对比一下原程序的输出。短语都能吻合上,证明我们的路是对的。
      这里写图片描述
      现在就走出了一大步了,至少,我们把无厘头的递归循环,简化成27条短语组合,接下来分析他们怎么组合的。
      我们可以发现格式是这样的
      A1 B1 A2 C1
      A1 B2 A2 C2 C1
      A1 B3 A2 C3 C2 C1

      A1 B12 A2 C12 C11 …… C2 C1
      这里写图片描述

    5. 这里分析不在脑算了,直接单步调试看call Stack窗口,不难看出进入第17行第三个main控制输出了A1,第二个顺次输出了B1–B12,第三个输出了A2,第二个控制B的顺序,主要是用_,需要我们知道他的call by的参数值,第一第三固定值,可以略过了。 顺次执行完这三个main后,执行逗号表达式后面语句,
    6. 这里就是C系列的控制逻辑了。用第19行的main控制C的个数级顺次,20行的main调用输出字符,这里参数t和都用上了。用携带信息是输出几个C,t所标示输出C?(? in 1,2,3……12)
    7. 由于这里是与逻辑,前面部分永真语句,所以后面的必会执行。这里,也就是调用的总源头了t==2,第一次执行,我们手算分析那儿t是等于2的然后调用这里的。所以条件成立的,进去
      _ < 13 这句话也就是12次递归循环的起源了。当_大于等于13后,后面只是常数直接返回,然后一步步结束这个递归。
      这里写图片描述
      好了。至此,我三次接触这段代码,总算有了一个善了的结果。写出来纪念一下,也分享给喜欢这段程序的你们。有什么疑问评论区交流。一起学习。
    展开全文
  • <code>#include<stdio.h> #include<malloc.h> #include<stdlib.h> typedef struct node { int id;//学号 char name[20]; int score;//成绩 struct node *next; }Lnode,*LinkList;... </p>
  • C语言---VS2017---输出中文乱码问题解决方案

    万次阅读 多人点赞 2018-03-13 22:31:02
    而编码问题就要考虑到多方面的因素,大致分为:文件编码、代码编码、输出结果显示的编码。我们只要以此来检查这三部分,就可以找到乱码的原因。而要想不出现乱码,那么这三部分都需要正确,其中一部分的编码并没有对...

     今天会员【HiroLCS】提到一个问题,就是在VS2017新建的C/C++控制台程序显示的中文竟然是乱码,效果图如下:

        VS2017控制台程序显示中文为乱码的问题解决办法

            出现乱码,必然是编码问题。而编码问题就要考虑到多方面的因素,大致分为:文件编码、代码编码、输出结果显示的编码。我们只要以此来检查这三部分,就可以找到乱码的原因。而要想不出现乱码,那么这三部分都需要正确,其中一部分的编码并没有对错之分,编码和解码一致才是正确的。

        1.文件编码

            将cpp文件使用Notepad++软件打开,然后底部状态栏的右边可以看到当前文件的编码。我们可以看到,我们在VS2017里创建的cpp文件,是UTF-8编码。

        2.代码编码

            代码编码指的是在VS项目中,我们在项目属性里指定的字符集,如下图所示:

        VS2017控制台程序显示中文为乱码的问题解决办法

            我们可以看到,VS项目里使用的字符集是Unicode编码。这个编码是对代码中出现的字符串默认使用的编码。所以你看到标题上是项目默认值。如果你在字符串里显式(刻意)指定字符串编码方式,如L"这就是Unicode编码字符串",因为左边有一个大写的字母L。或者使用printf这样的ASCII版本字符串的函数,就只能是ASCII编码。我们一般说的是ANSI编码,ANSI编码就做内码,意思是系统内部使用的编码,会自动将你这些字符串编码为系统默认使用的字符集,我们一般都是GB2312,因为我们是中国。如果我们直接说是ASCII编码,也就是VS2017里对应的多字节字符集。

            如果你在代码中直接写双引号,然后也不管字符集这些,再没有特地指定编码的函数里,系统会自动使用默认的编码字符集来编码字符串,也就是你上面看到的项目属性里的【使用Unicode字符集】。

            如果我们直接创建一个项目,然后输入中文,然后就显示了乱码。自然这个和代码的编码无关。不管你用哪种字符集,都会出现乱码。代码编码乱码一般出现在字符编码转换时出现。

        3.显示编码(解码)

            当控制台程序运行的时候,结果输出在控制台黑窗口中。此时我们才看得到输出的结果。如果确定控制台显示使用的编码呢?我们启动控制台程序,然后在控制台的标题栏里右击,选择“属性”,如下图:

        VS2017控制台程序显示中文为乱码的问题解决办法

            然后弹出一个对话框,如下图所示:

        VS2017控制台程序显示中文为乱码的问题解决办法

            可以看到,控制台使用的是GBK编码,即GB2312编码。找了一下,控制台这里没有修改显示编码的地方。

            检查一遍我们发现,文件编码是UTF-8,代码编码不影响,显示时解码用的是GBK编码。也就是说,存储到文件的字符是UTF-8编码,而我们控制台显示的编码是GBK,自然就是编码不对应,产生了乱码。

            解码的办法就是让保存文件的编码和显示的编码一致即可。前面发现控制台编码不能直接在属性里修改,修改起来不方便。那么我们来改变文件的编码咯。

            我们可以用Notepad++软件将cpp文件的编码修改为ASCII即可,这样就对应到了GBK编码。这样就没有乱码了。当然,VS里也有修改文件编码的功能。在VS2010等VS版本里,在文件菜单下,选中了文件之后,就可以看到高级保存选项,这里就可以修改文件的编码。然而在VS2017却故意去掉了,需要我们额外找出来。

            在“工具”->“自定义”->“命令”界面中,如下图所示:

        VS2017控制台程序显示中文为乱码的问题解决办法

            我们点击“保存选定项”,然后点击“添加命令”,弹出如下界面:

        VS2017控制台程序显示中文为乱码的问题解决办法

            我们在左边选择“文件”,然后在右边选择“高级保存选项(V)...”,确定即可。添加后是这样的:

        VS2017控制台程序显示中文为乱码的问题解决办法

        VS2017控制台程序显示中文为乱码的问题解决办法

            我们发现,文件菜单下的“高级保存选项”就出来了。我们可以用这个菜单项来修改代码文件的编码了,而不需要借助第三方编辑器了。我们打开我们要修改的cpp文件,然后点击“高级保存选项”,弹出如下界面:

        VS2017控制台程序显示中文为乱码的问题解决办法

            开始时显示的是Unicode编码,我们这里已经改为了GB2312编码了。然后确定即可。

            此时我们再编译代码,然后没有乱码了。如下图所示:

        VS2017控制台程序显示中文为乱码的问题解决办法

    展开全文
  • 输入 i am a student,输完一个单词按enter再输入,输‘0’结束,输出结果就乱了,为什么呢? 但是直接输入 i am a student就可以完整输出 ``` #include #include //定义结构体 struct list { ...
  • 题目: ; margin-right:0">(1) 定义一个包括:学号、姓名、性别、年龄和三...原本有的前三个成员的名字和性别都是乱码,成绩学号什么的都没问题,哪出了问题搞不明白,求助!</p>
  • 为什么puts(s2)输入的有乱码,我用的是win7+C-Free4.0。 代码如下: #include int main() { char s1[4],s2[7],c; int i,j; printf("请输入s1:"); gets(s1); printf("*****s1输入成功*****\n"); puts(s1); ...
  • 我是根据这个题目的要求来写了一个双链表,然后利用gb表示光标实现各个符号的插入,可是有的时候能输出正确的结果,有的时候会输出乱码,有的时候不输出,这是怎么回事啊,不知道哪个代码块出现了问题,求大神解答!...
  • </li><li>按照字符串数组顺序输出分割结果,如下示例所示:</li></ol> 初始字符串:”abc;edf;cde;xyz” 字符串1:”abc;” 字符串2:”edf;” 字符串2:”cde;” 字符串2:”xyz;” <p>#...
  • 问题:输出中文字符乱码 今天从txt读中文到字符串数组里输出发现中文是乱码,原本以为是读入方式的问题,结果是文件本身的问题,令人抓狂!!!!!!

    问题:打印出的中文字符是乱码

    今天从txt读中文到结构体的字符串数组里输出发现中文等全是乱码,原以为是读入方式的问题,结果是文件本身的问题,抓狂!!!!!!

    解决方法: 

    将txt文本编码格式改成ANSI:打开记事本->文件->另存为->更改编码格式为ANSI->保存。

     

    展开全文
  • string s="helloworld";...printf只能输出C语言中的内置数据,string不是c语言内置数据。 更深入的来说:s这个string类型的对象并非单单只有字符串,其内还有许多用于操作的函数,于是&s并非字...
    string s="helloworld";
    printf("%s",s);
    

    运行上述程序,会出现下面的结果。
    在这里插入图片描述这是怎么回事啊,%s对应字符串类型,应当没有错啊。
    如果将输出语句改成cout,输出则会恢复正常。
    printf只能输出C语言中的内置数据,string不是c语言内置数据
    更深入的来说:s这个string类型的对象并非单单只有字符串,其内还有许多用于操作的函数,于是&s并非字符串“helloworld”的首地址,而是s这个对象的首地址。
    所以要做如下操作:
    string s = “helloworld”;
    printf("%s" , s.c_str());//string中c_str()成员方法返回当前字符串的首字符地址。
    所以方便点还是cout吧。

    展开全文
  • printf("输出文件!\n"); } fclose(out); } void readFromFile(){ FILE in; in = fopen( "BOOK.txt", "rb" ); if(in==NULL){ printf("无法打开文件!\n"); return; } count=0; head=NULL; p=NULL; old=NULL; ASK(p); ...
  • 为了验证是不是只有python这样显示乱码,我特意安装了c编译环境,试了试c语言是否显示正文乱码结果一切正常,这说明只有python中文编码有问题。 为了解决这一问题,我特意查阅了许多文档,结果发现确实有许多解决...
  • 上述代码若用double声明,结果乱码 若使用float声明,则结果运行正确 之前有了解到float输出时是先转换为double型,再按%f输出 这里不清楚为什么单精度和双精度对结果会产生影响 编译器使用的是codeblocks
  • 第一点你要明白的是,如果你的编译的环境是没有问题的话,那么结果就只能是你的内容不能被被编译器正确的理解。 举个例子 如果你同时接收字符和数字 如scanf("%d%c%d",&a,&ch,&b); 假设你输入 7:54 ...
  • C语言 Unicode字符问题

    2019-07-29 20:26:21
    运行出现乱码 2、char 只能是字母,数字,字符 char字符串可以显示汉字,字符不可以,字符连在一起%c%c可以输出汉字 3、 打印出2,说明ch占两个字节 4、wprintf函数 通过%wc格式输出符 打印出一个汉字 ...
  • 这段代码在rhel6中用gcc编译通过,运行结果未定义,其中作的链表按number大小排序打印出来是没有排过序的结果,而且输入记录多了,其中某些项的number打印出来会由输入的值变成0或者一个莫名其妙的整数. vs2008中编译...
  • c语言生成随机字符串

    2021-01-30 15:10:35
    <code class="language-cpp">#include<stdio.h> #include<stdlib.h> #include<time.h> int main() ...为啥输出结果里会含有一个'?',而且输出有时还会乱码?刚学到这不知道哎</p>
  • 这下边使我测试的输出结果:为什么会有不适乱码的输出呢,释放了内存不是应该清空数据了么, 请输入元素个数:10 0 1 2 3 4 5 6 7 8 9 动态一维数组的内容为: 0 1 2 3 4 5 6 7 8 9...
  • c语言程序实现对素数的判断

    万次阅读 多人点赞 2018-07-30 13:40:15
    为了便于观察结果,在控制台里每一行输出5个数,并且这5个数之间以空格作为分隔 思路: 首先要知道什么是素数以及如何判断一个数是不是素数,素数就是除了1和它自身外,没法被其他自然数整除的数;知道怎样判断...
  • 思路:要想将一段汉子逆置你必须清楚一个汉子是相当于两个字符的,那处理起来就很简单了,小编当时做此题的时候绞尽脑汁,试了好多遍就是因为在字符这地方没有处理好,导致输出结果乱码。此题只用定义两个指针,一...
  • //输出结果 system("pause"); return 0; } void down_sort(char *string, int mid) //冒泡降序排列 { int end, num, tmp; for (end = 0; end (mid - 1); end++) { for (num = 0; num ; num++) { if ...
  • #include #include #include int main() { int top,mid,end; int n; for(n=100;...```如果将pow(top,3)与pow(end,3)调换又可以输出全部三位数的水仙花数,还有乱码是神马情况啊?求教
  • 我用一个子函数初始化了一个结构体并返回结构体的地址,但是却发现在主函数中输出的num和str字符串和子函数中输出的不一样,主函数中输出的内容更像是一些乱码,但是两个函数中的地址是一致的,这是哪儿出现什么问题...
  • 中文乱码是在g++编译后的项目编译结果中出现,并非C语言项目输出中文乱码。 GCC/G++乱码的解决方案在网上流传得最多的是: export LANG=C 这个方法是可以解决GCC/G++乱码的问题,但是会导至系统中一些其他工具无法...
  • c语言 异或char类型导致高位置1

    千次阅读 2014-12-15 16:22:35
    今天调试代码遇到个问题 直接打印字符串 显示乱码,需要转换为二进制比较,网上的资料是使用encode('hex')但是后续调用swig接口函数的过程中,对汉明距离进行计算得到的结果很奇怪,输出字符串1:2c20f2 输出字符串2...
  • 为什么第一个数组输出的是abc,而第二个数组输出结果不是我们所想呢? 这是因为第二个数组并不是字符串,而是多个字符所组成。而我没有给第二个数组的末尾添加‘\0’字符,从而导致后面是随机数所造成的乱码。直到...
  • //给定一个字符串,把字符串内的字母转换成该字母的下一个字母,a换成b,z换成a,Z换成A, ...为什么输出结果总是会乱码? ![图片说明](https://img-ask.csdn.net/upload/201509/12/1442024742_879798.png)
  • 而且显示出来会乱码,文件复制也是失败 <p style="text-align:center"><img alt="" height="326" src="https://img-ask.csdnimg.cn/upload/1606899905349.jpg" width="671" /></p>  </p>
  • 就是一个普通的Helloworld文件,程序没有任何问题,环境变量都设置完了,还有就是中文输出结果的时候出现的都是乱码,咋解决 三个文件配置如下 求解啊,困扰我几天了QAQ ...
  • 近期研究设计模式,在程序输出时心血来潮用了c版本的printf,结果就蛋疼了,一直输出乱码, string s = "中国"; printf("%s" , s);//输出乱码 果断切换成c++版本的cout发现可以正常输出。于是上网找答案,...

空空如也

空空如也

1 2 3
收藏数 47
精华内容 18
关键字:

c语言输出结果乱码

c语言 订阅