- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在编写一个 C++ 程序,它要求用户输入一个单词或句子,检查单词/句子,用“aoa”或“AoA”替换“a”或“A”的所有实例,然后输出结果。但是,如果我尝试输入更长的句子,就会遇到问题。例如,如果我输入“为什么程序不正常”,程序会输出奇怪的字母而不是预期的结果。这是我的代码:
#include <iostream>
#include <string>
using namespace std;
int main(int argc, const char * argv[])
{
string mening, temp; //The mening string is the word/sentence the user will input.
int play = 1, add;
while (play == 1) {
cout<<"Type in the sentence: ";
getline(cin, mening); //The input is saved in the string variable mening.
unsigned long y = mening.size(); //Grabs the amount of characters in input; this number is saved in the unsigned long variable y.
add = 0; //Makes sure the int variable add is reset to 0 if the loop restarts.
for (int k = 0, n = 1;n<=y;k++, n++) {
if (mening[k] == 'a' || mening[k] == 'A') {
k++;
for (int i = k, m = 1;m<=y - n;i++, m++) {
temp[i] = mening[i];
} //The characters after the one that has been checked are stored in temp array indexes, if the character that has been checked is an a or A.
for (int i = k, m = 1, j = k + 2;m<=y - n;i++, m++, j++) {
mening[j] = temp[i];
} //The characters after the one that has been checked move two steps to the right, to allow the two extra letters.
mening[k] = 'o';
mening[k + 1] = mening[k - 1];
k++;
add = add + 2; //The int variable add is increased by 2 during each aoa/AoA to avoid strange characters being outputted at the very end.
}
else { }
}
for (int k = 0;k<=y + add - 1;k++) {
cout<<mening[k];
}
cout<<endl<<"Do you want to do it again? (yes/no): ";
getline(cin, mening);
cin.clear();
cout << flush;
cout.flush();
cout.clear();
if (mening == "Yes" || mening == "yes" || mening == "YES") {
}
else {
play = 2;
}
}
cout<<endl<<"The program will now close.";
return 0;
}
可能导致问题的原因是什么?
最佳答案
一个紧迫的问题是您从 [1,n]
建立索引,而 C++(std::string
、std::vector
,还有 C 风格数组)使用 [0,n)
。这意味着您将可以访问字符串的结尾。你正在将字符存储到 temp
使用 temp[x]
,尽管 temp
的大小始终为 0。两者这些是未定义的行为,可能会产生任何影响(包括使程序崩溃)。
你应该使用标准库的 Debug模式开发代码。在 Visual Studios 中,我认为这是默认;使用 g++,您需要添加 -D_GLIBCXX_CONCEPT_CHECKS
到你的命令线。
-D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC
处理这个问题的最简单方法是复制到一个新字符串中,随时进行更改:
std::string results;
for ( auto current = mening.cbegin(); current != mening.cend(); ++ current ) {
switch ( *current ) {
case 'a':
results += "aoa";
break;
case 'A':
results += "AoA";
break;
default:
results += *current;
break;
}
}
如果您确实想就地进行替换,就会变得很棘手。当插入的文本多于开始时,迭代器是无效。所以你需要这样的东西:
static std::string const Ao( "Ao" );
static std::string const ao( "ao" );
for ( auto current = mening.begin(); current != mening.end(); ++ current ) {
switch ( *current ) {
case 'a':
current = mening.insert( current, ao.begin(), ao.end() ) + 2;
break;
case 'A':
current = mening.insert( current, Ao.begin(), Ao.end() ) + 2;
break;
}
}
就我个人而言,我更喜欢复制到一个新字符串中。
关于c++ - 较长的 getline cin 输入问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18877635/
我使用 cin.peek() 方法获得了这段代码。我注意到奇怪的行为,当程序输入看起来像 qwertyu$[Enter] 时,一切正常,但是当它看起来像 qwerty[Enter]$ 时,它仅在我键入
#include #include using namespace std; int main(){ ofstream fout("student.dat",ios::out); char name[
我是 C++ 编程新手,遇到了障碍。这是我的代码: #include using namespace std; int main(){ int sum = 0, a; cout >
我有一个简单的程序,当输入完全符合预期时,它名义上可以工作。 #include using namespace std; int main () { int a, b; char a
int main () { int num1, num2; int cnt = 1; if (cin >> num1){ while (cin >> num2){
我有这个程序,但 cin 随机跳过..我的意思是有时它会,有时它不会。有什么解决办法吗? int main(){ /** get course name, number of
我是一名正在准备期末考试的 C++ 初学者。我用两种方式写了一个程序。第一个代码使用 cin.getline() 并且不能正常工作。第二个代码使用 cin.get() 和 cin >> 并正确执行所有
据我所知,在 cin 之后使用 getline() 时,我们需要先刷新缓冲区中的换行符,然后再调用 getline(),我们通过调用 cin.ignore() 来完成此操作。 std::string
我正在尝试以下代码: int main() { char str1[20]; int a; cout > a; cout > 忽略空格(即 ' ', '\t', '\n
我刚开始阅读 C++ 11 入门书,目前在 if 语句部分。我以前有使用 Java 的经验,但 C++ 输入/输出确实让我感到困惑。为了方便起见,我将多个练习放在一个文件中。但是,似乎自从我调用了 w
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: c++ cin input not working? 我一直在尝试使用以下 C++ 代码在整数后输入字符串。
需要 I/O 重定向,我不能使用 fstream。我用 I/O通过使用 ">line)通过 I/O 读取文件重定向。然后我需要 cin>>x ,但这次是在运行时进行用户输入,但会被跳过。 我试过了 c
我正在尝试使用 getline() 但在输入第一个记录光标后不要等待第二个国家/地区名称,它会跳过并跳转到首都名称。我的错误在哪里。如果我输入 国家:印度 首都:德里 Capita:57382 它可以
我有以下循环。它应该读取数字直到 EndOfFile,或者用户输入 -999 int arr[100]; int index; for (index = 0; index > arr[index];
以下两个循环和每个循环什么时候停止有什么区别? #include #include #include using namespace std; int main() { int x,y;
在这个程序的每次输入中,我希望用户能够输入他们想要的任意数量的“单词”(意思是用空格/制表符分隔的文本)......但是不允许用户输入单词超出当前 cin。例如:如果我键入 John Smith Do
int main() { int oddeven = 1; int modulotwo; // Simple loop since no reason to check 0
我写了一个 switch 语句,并创建了一个默认值,它会简单地说用户选择了一个错误的选项并重复输入。我想确保如果出现问题,它会首先清除缓冲区,所以我使用了 cin.sync(),但输入 'a' 仍然会
我是一个新手程序员,正在练习下面的这个程序。无论出于何种原因,在我的程序结束时,cin.ignore() 被编译器完全跳过并直接移动到 cin.get(),但是之前已经有一个按键,所以编译器完全跳过它
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
我是一名优秀的程序员,十分优秀!