字谜字符数组 我在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) }
它将x作为第一个元素,验证y是否拥有它,如果y拥有它,它将被删除。我真的不明白。 因此,strhr返回一个指针,指向x在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
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++中,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++中不起作用的东西,反之亦然。
- 是C99标准(更新的)但不属于任何C++标准的可选特征。一些编译器(例如,代码> G++<代码>)将其作为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);
}