字符数组在输出时添加随机字符
Character array adds random characters at outputting
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
函数returns一对对象。第一个指定传入字符串中辅音最大序列的起始指针,第二个对象指定序列的长度。
要了解该函数的工作原理,您只需阅读两个 C 字符串函数 strspn
和 strcspn
.
的说明即可
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
函数returns一对对象。第一个指定传入字符串中辅音最大序列的起始指针,第二个对象指定序列的长度。
要了解该函数的工作原理,您只需阅读两个 C 字符串函数 strspn
和 strcspn
.