gpt4 book ai didi

c++ - 如何修复 C++ 中的随机字符输出?

转载 作者:行者123 更新时间:2023-11-28 04:17:46 24 4
gpt4 key购买 nike

当我使用 char 数组获取字符串输入并使用 for 循环遍历它们时,我的代码总是有不应该出现的随机字符输出。

我已尝试通过检查各个阶段的输出来调试我的代码,但我找不到发生这种情况的原因。

    int k, s, counter = 0;
char word[21];

std::cin>>k;
std::cin.getline(word,21);
for (int i = 0; word[i] != ' '; i++)
{
s = 3*(i + 1) + k;
std::cout<<s;
for (int k = 0; k < s; k++)
{
word[i]--;
if (word[i] < 'A')
word[i] = 'Z';
}
std::cout<<word[i];
}

当我输入 3 以获得 k 的值时,我已经得到了输出“URORIFCFWOQNJCEBFVSPMJNKD”,而我不应该得到任何输出。

最佳答案

问题是在使用getline 之前没有刷新缓冲区.
因此,当您在输入数字后按回车键时,该回车(字符“\n”)将传递给 getline() ,此时 getline 通过离开 word 结束了他的工作。空。

这个问题的解决方案很简单:在 getline 之前刷新缓冲区。

这里是完整的解决方案:

#include <iostream>

int main() {
int k, s, counter = 0;
char word[21];

std::cin>>k;

// Clear the buffer
std::cin.clear();
while (std::cin.get() != '\n')
{
continue;
}

std::cin.getline(word,21);

std::cout<<"TEST>"<<word<<"<TEST"<<std::endl<<std::flush;

for (int i = 0; word[i] != ' '; i++)
{
s = 3*(i + 1) + k;
std::cout<<s;
for (int k = 0; k < s; k++)
{
word[i]--;
if (word[i] < 'A')
word[i] = 'Z';
}

// Use std::flush to forcefully print current output.
std::cout<<word[i]<<std::flush;
}
}

注意事项:

  • 我使用了 there 中描述的缓冲区清除机制.您可能会使用另一个,但想法是一样的
  • 如果注释缓冲区清除部分的 4 行,您会注意到只要键入“3”并按回车键,您就会看到类似 "TEST><TEST" 的输出。这意味着 word里面是空的。
  • 考虑使用 std::flush如果您想在 for 循环结束之前强制打印输出,请使用 cout。

关于c++ - 如何修复 C++ 中的随机字符输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56225519/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com