如何解决字谜字符数组
所以我的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具有,则将其删除。我不太了解 因此,strchr返回一个指向x在y中出现的指针。在那之后,我不太了解。顺便说一句
char a[] = "children" ;
char *p = strchr(a,'i') ;
*p = NULL";
为什么“ h”之后的所有内容都消失了? P指向“ i”,所以不应该只是消失“ i”吗? 谢谢! (我仍然是初学者)
解决方法
关于为什么'h'之后的所有内容都消失了?:
char a[] = "children" ;
char *p = strchr(a,'i') ;
*p = NULL";
-
有一个错字:可能是
*p = NULL;
(双引号"
是错误的。) -
p
的类型为char*
。应用取消引用运算符*
将导致pointe类型。因此,表达式*p
的类型为char
。 (请不要将它与声明了char *p
类型的变量p
的声明char*
混淆。)NULL
旨在表示空指针。 (在C语言中,可能将其定义为#define NULL (void*)0
。在C ++中,nullptr
应该比NULL
更受青睐。)为char
分配空指针会令人困惑,但是C编译器(以及C ++编译器)可能会将其隐式转换回普通的0
。我使用
gcc -std=c11
和g++ -std=c++17
进行了编译。在这两种情况下,编译器都会发出警告,但会提供可执行的二进制文件:- C: Live Demo on coliru
输出:warning: assignment to 'char' from 'void *' makes integer from pointer without a cast [-Wint-conversion] *p = NULL;
- C++: Live Demo on coliru
输出:warning: converting to non-pointer type 'char' from NULL [-Wconversion-null] *p = NULL;
因此,应该是
*p = 0;
或更清晰的*p = '\0';
,它在语义上是相同的,但更清楚地揭示了意图。 - C: Live Demo on coliru
考虑到这一点,固定版本为:
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','\0','\0' }
因此,它仍然具有相同的长度,但是将其与C字符串函数(例如printf("%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";
}
输出:
a[]: 'ch'
a[]: { 'c','\0' }
关于OPs C / C ++书的注释:
事实上,C ++语言是从已经存在的C语言中演变而来的。C和C ++仍然彼此相关。例如。 C标准库的一部分被C ++标准库采用。
不过,这是两种具有各自标准的独立语言。
- 有些C语句也可以在C ++中使用。
- C中有些东西在C ++中的工作有点不同。
- C中有些东西在C ++中不起作用,反之亦然。
最后一个示例:
- auto是C中有效的存储类。在C ++中,此含义自C ++ 11起已失效,并且关键字具有新的语义:placeholder type specifier
- Variable Length Arrays是C99标准(及更高版本)的可选功能,但不是任何C ++标准的可选功能。某些编译器(例如
g++
)将其作为C ++中的专有扩展来支持。 - Type Punning with
union
在某种程度上被C标准合法化,但被C ++标准禁止。 - 当然,C ++引入了各种新关键字(具有新的语义),例如
class
和template
在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);
}
输出:
sizeof a: 4
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);
}
输出:
sizeof a: 1
auto
从其初始化确定a
的类型。在C ++中,字符常量的类型为char
(与C相对应,字符常量的类型为int
)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。