字符数组在输出时添加随机字符

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 个字符?

对于初学者,您应该编写一个函数来找到最长的辅音序列。

您提供的代码不完整,因此很难对其进行分析。例如,没有看到变量 substrempty 在此调用中的使用位置和方式

strcpy(substr, empty);

定义及其含义是什么。

还有这样的说法

memset(show, 0, 256);

没有意义,因为例如在这条语句之后有语句

strcpy(show, substr);

所以前面的说法是多余的

或者例如,这些变量 sisubstr 中的一个似乎也是多余的。

我可以建议将以下解决方案实现为一个函数。

#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 字符串函数 strspnstrcspn.

的说明即可