c++ - 字符数组在输出时添加随机字符
问题描述
cin.get(a, 256);
for(int i = 0; i < strlen(a); i++){
if(strchr("aeiou", a[i])){
s = 0;
strcpy(substr, empty);
isubstr = 0;
}
else{
s++;
substr[isubstr++] = a[i];
if(s > maax || s == maax){
maax = s;
memset(show, 0, 256);
strcpy(show, substr);
}
}
}
cout << show;
这是代码。它打算找到只有辅音的最长子串,如果有 2+ 个具有相同长度的子串,它会输出最远的子串(更靠近右边)
考虑以下顺序:
jfoapwjfppawefjdsjkflwea
由元音分开,它看起来像这样:
jf |oa| pwjfpp |a| w |e| fjdsjkflw |ea|
请注意“fjdsjkflw”如何是没有元音的最大子字符串。此代码仅输出最后包含一些随机数的内容:
fjdsjkflwê²a
为什么会这样?为什么它将 NULL 3 个字符超出预期的范围?
解决方案
对于初学者,您应该编写一个函数来找到这样一个最长的辅音序列。
您提供的代码不完整,因此很难对其进行分析。例如,没有看到变量在哪里以及如何substr
在empty
此调用中使用
strcpy(substr, empty);
被定义,它们的含义是什么。
还有这样的说法
memset(show, 0, 256);
这没有任何意义,因为例如在这个语句之后有这个语句
strcpy(show, substr);
所以前面的陈述只是多余的。
或者例如,这些变量之一似乎s
也是isubstr
多余的。
我可以建议以下解决方案作为函数实现。
#include <iostream>
#include <utility>
#include <cstring>
std::pair<const char *, size_t> max_consonant_seq( const char *s )
{
const char *vowels = "aeiouAEIOU";
std::pair<const char *, size_t> p( nullptr, 0 );
do
{
size_t n = std::strcspn( s, vowels );
if ( n != 0 && !( n < p.second ) )
{
p.first = s;
p.second = n;
}
s += n;
s += std::strspn( s, vowels );
} while ( *s );
return p;
}
int main()
{
const char *s = "jfoapwjfppawefjdsjkflwea";
auto p = max_consonant_seq( s );
if ( p.second ) std::cout.write( p.first, p.second ) << '\n';
return 0;
}
程序输出为
fjdsjkflw
该函数返回一对对象。第一个对象指定传递的字符串中最大辅音序列的起始指针,第二个对象指定序列的长度。
要了解该函数的工作原理,您只需阅读两个 C 字符串函数strspn
和strcspn
.
推荐阅读
- python - 将 Azure 翻译的 PDF 文件保存为 MS Word docx 文件
- python-3.x - Python 网络日志记录示例 - 如何禁用服务器端控制台打印
- javascript - 让 Bootstrap 日期选择器显示为字符串,但格式为 yyyy-mm-dddd
- java - 我无法让它在 java 中的工资单程序上正确扣除。我得到的错误是我的变量之一尚未初始化
- javascript - Vue.js/NuxtJS - 如何创建具有可通过 JSON 配置文件自定义的默认设计的组件
- docksal - Docksal 和 Git 浅问题
- javascript - React-Redux:操作已分派,但 Reducer 未更新状态
- python - 为什么带有 @tf.function 的 TensorFlow 2.x 的速度是 pytorch 的两倍?
- bison - 我的解析器没有意识到它应该采用规则的第二个分支
- excel - 如何在 Excel 中为注释的特定行(存在条件)着色?