字谜字符数组 我在C++书中有这个算法 int anagrams(char *x, char *y) { char *p; if (!*x && !*y) return 1; p = strchr(y, *x); if (!p) return 0; *p = NULL; strcat(y, p + 1); return anagrams(x + 1, y) }

字谜字符数组 我在C++书中有这个算法 int anagrams(char *x, char *y) { char *p; if (!*x && !*y) return 1; p = strchr(y, *x); if (!p) return 0; *p = NULL; strcat(y, p + 1); return anagrams(x + 1, y) },c++,string,pointers,recursion,char,C++,String,Pointers,Recursion,Char,它将x作为第一个元素,验证y是否拥有它,如果y拥有它,它将被删除。我真的不明白。 因此,strhr返回一个指针,指向x在y中出现的位置。在那之后,我真的不明白。顺便说一下 char a[] = "children" ; char *p = strchr(a, 'i') ; *p = NULL"; 为什么这里的一切在“h”消失之后?P指向“i”,所以“i”不应该消失吗? 谢谢(我还是一个初学者)关于为什么这里“h”之后的一切都消失了 有一个输入错误:可能是*p=NU

它将x作为第一个元素,验证y是否拥有它,如果y拥有它,它将被删除。我真的不明白。 因此,strhr返回一个指针,指向x在y中出现的位置。在那之后,我真的不明白。顺便说一下

char a[] = "children" ;
char *p = strchr(a, 'i') ;
*p = NULL";
为什么这里的一切在“h”消失之后?P指向“i”,所以“i”不应该消失吗? 谢谢(我还是一个初学者)

关于为什么这里“h”之后的一切都消失了

  • 有一个输入错误:可能是
    *p=NULL(双引号
    错误。)

  • p
    属于
    char*
    类型。应用反引用运算符
    *
    会产生指针类型。因此,表达式
    *p
    属于
    char
    类型(请不要将其与声明
    char*p
    混淆,后者声明了
    char*
    类型的变量
    p
    )<代码> null <代码>意指一个空指针。(在C中,它可以被定义为<代码>空(空*)0 < /代码>。在C++中, NulLPTR< /Cult>应该优于 null 。将空指针分配给<代码> char < /代码>是令人困惑的,但是C编译器(以及C++编译器)可能会隐式地将其转换回普通的
    0

    我使用
    gcc-std=c11
    以及
    g++-std=c++17
    编译了此文件。在这两种情况下,编译器都会发出警告,但会提供一个可执行二进制文件:


    • 输出:
      警告:从'void*'分配到'char'会从指针生成整数,而无需强制转换[-Wint转换]
      *p=零;
      

    • 输出:
      警告:从NULL[-Wconversion NULL]转换为非指针类型“char”
      *p=零;
      
    因此,它应该是
    *p=0;
    或者更清楚地
    *p='\0';
    ,这在语义上是相同的,但更清楚地揭示了意图

  • 考虑到这一点,固定版本为:

    char a[] = "children" ;
    char *p = strchr(a, 'i') ;
    *p = '\0';
    
    它用
    i
    替换元素,用
    \0
    替换元素,后者是C字符串中的字符串终止符

    char a[]
    以前是:

    { 'c', 'h', 'i', 'l', 'd', 'r', 'e', 'n', '\0' }
    
    并在本次任务后成为

    { 'c', 'h', '\0', 'l', 'd', 'r', 'e', 'n', '\0' }
    

    这样,它仍然具有相同的长度,但是使用C字符串函数(例如,代码> PrtTf(“%s”,a);)将考虑第一个找到的字符串终止符。 因此,它将仅打印

    ch

    演示用于演示:

    #include <cstring>
    #include <cstdio>
    #include <iomanip>
    #include <iostream>
    
    int main()
    {
      char a[] = "children" ;
      char *p = strchr(a, 'i') ;
      *p = '\0';
      // printing a c string
      printf("a[]: '%s'\n", a);
      // print a[] element wise
      std::cout << "a[]: {";
      const char *sep = " ";
      for (char c : a) {
        std::cout << sep << '\'';
        if (c >= ' ' && c < '\x7f') std::cout << c;
        else std::cout << '\\' << std::oct << (unsigned)(unsigned char)c << std::dec;
        std::cout << '\'';
        sep = ", ";
      }
      std::cout << " }\n";
    }
    


    关于OPs C/C++书籍的说明:

    <> P>这是一个事实,即C++语言已经从已有的语言中演化出来了。C++和C++仍然是相互关联的。 然而,这是两种独立的语言,有各自的标准

      《C++》中也有C++语句。 C++中有一些东西在C++中有点不同。 C中有一些在C++中不起作用的东西,反之亦然。
    最后的例子:

      是C++中C.中的一个有效存储类,这个意义自从C++ 11以来就已经失效了,并且关键字得到了一个新的语义:
    • 是C99标准(更新的)但不属于任何C++标准的可选特征。一些编译器(例如,代码> G++<代码>)将其作为C++中的专有扩展支持。
    • 是由C标准合法化的(但在一定程度上),但C++标准禁止。 当然,C++引入了各种新的关键字(新语义),如代码>类<代码>和<代码>模板>代码>,它们在C中不可用,将被解释为简单标识符。

    一个(无可否认是有点做作的)示例表明,在C和C++中,相同的源代码可能导致不同的语义:

      auto a = 'a';
      printf("sizeof a: %d\n", (int)sizeof a);
    
    在C11中:

    #include <string.h>
    #include <stdio.h>
    
    int main()
    {
      auto a = 'a';
      printf("sizeof a: %d\n", (int)sizeof a);
    }
    

    auto
    是存储类。
    auto A
    中缺少一个类型。C编译器将其默认为
    int

    在C++11中:

    #include <cstring>
    #include <cstdio>
    
    using std::printf; // pull printf() into global scope
    
    int main()
    {
      auto a = 'a';
      printf("sizeof a: %d\n", (int)sizeof a);
    }
    


    <>代码> Audio/Cuff>从初始化开始确定<代码> A<代码>的类型。在C++中,字符常量属于“Cyth> char < /C++ >类型(与C相反,在这里它们有类型<代码> int <代码> >)。(这并不意味着它不能用C++编译,但习语C++代码应该以不同的方式来教。)——当然,我的坏,我的书是C/C++为您第一次公开的片段,请提供一个例子,它是如何调用的。
    #include <cstring>
    #include <cstdio>
    
    using std::printf; // pull printf() into global scope
    
    int main()
    {
      auto a = 'a';
      printf("sizeof a: %d\n", (int)sizeof a);
    }