首页 > 解决方案 > 字符数组在输出时添加随机字符

问题描述

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 个字符超出预期的范围?

标签: c++substringmaxc-stringsfunction-definition

解决方案


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

您提供的代码不完整,因此很难对其进行分析。例如,没有看到变量在哪里以及如何substrempty此调用中使用

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


推荐阅读