【问题标题】:Character array adds random characters at outputting字符数组在输出时添加随机字符
【发布时间】:2021-06-10 22:25:07
【问题描述】:
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 个字符超出预期?

【问题讨论】:

  • 仅供参考 -- for(int i = 0; i &lt; strlen(a); i++) -- 您在循环的每次迭代中调用 strlen(a)。太浪费了。
  • 为什么会浪费? @PaulMcKenzie
  • 您确实意识到strlen 必须扫描字符串以查找空字节?如果字符串是 256 个字符怎么办?每次循环迭代时,您都将扫描字符串,使代码实际上总共有 65536 个字符。计算一次strlen,将其存储在一个变量中,然后在for 循环中使用该变量。
  • 啊,他们以错误的方式教授 C++,正如 Kate Gregory 的演示文稿中所指出的那样。
  • 在向其添加字符之后,或在将其复制到 show 之前。 (substr[isubstr] = '\0';

标签: c++ substring max c-strings function-definition


【解决方案1】:

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

您提供的代码不完整,因此难以分析。例如,没有看到变量 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

函数返回一对对象。第一个对象指定传递的字符串中最大辅音序列的起始指针,第二个对象指定序列的长度。

您只需阅读strspnstrcspn 这两个C 字符串函数的说明即可了解该函数的工作原理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-16
    • 1970-01-01
    • 2020-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多