2017-08-07 40 views
-3

使用C++语言,函数LetterChanges(str)采用str参数传递并使用以下算法对其进行修改。字符串代码不工作

将字符串中的每个字母替换为 字母表中的后面的字母(即c变成d,z变成a)。然后在这个新的字符串(a,e,i,o,u)中大写每个元音 ,并最终返回这个修改后的 字符串。

#include <iostream> 
using namespace std; 

string LetterChanges(string str) { 

    // code goes here 
    string str2 = "abcdefghijklmnopqrstuvwxyz"; 
    int j; 
    for (int i = 0; str[i] != '\0'; i++) { 

     for (j = 0; str2[j] != '\0'; j++) { 

      if (str[i] == str2[j]) { 

       str[i] = str2[j + 1]; 

      } 
     } 
    } 
    for (int i = 0; str[i] != '\0'; i++) { 
     if (str[i] == 'a') { 
      str[i] = 'A'; 
     } 
     else if (str[i] == 'e') { 
      str[i] = 'E'; 
     } 
     else if (str[i] == 'i') { 
      str[i] = 'I'; 
     } 
     else if (str[i] == 'o') { 
      str[i] = 'O'; 
     } 
     else if (str[i] == 'u') { 
      str[i] = 'U'; 
     } 
    } 
    return str; 
} 
int main() { 
    // keep this function call here 
    cout << LetterChanges(gets(stdin)); 
    return 0; 
} 

我试图运行此代码,但它是不是给的愿望输出请帮助..

+7

这听起来像你可能需要学习如何使用调试器来逐步通过你的代码。使用一个好的调试器,您可以逐行执行您的程序,并查看它与您期望的偏离的位置。如果你打算做任何编程,这是一个重要的工具。进一步阅读:[如何调试小程序](http://ericlippert.com/2014/03/05/how-to-debug-small-programs/) – NathanOliver

+0

在前两个For循环我试图复制字母和在下一个循环尝试大写小写元音。 –

+0

函数'string LetterChanges(string str)'没有机会修改传递给它的字符串(只是它的一个副本)。也许把它改为'string LetterChanges(string&str)'? – user463035818

回答

2

的功能

让我们先从你的第一个循环:

for (int i = 0; str[i] != '\0'; i++) { 
    for (j = 0; str2[j] != '\0'; j++) { 
     if (str[i] == str2[j]) { 
      str[i] = str2[j + 1]; 
     } 
    } 
} 

这里有几件事。首先,我们甚至不需要处理str2。用C++人物使用ASCII编码,这意味着我们实际上可以这样做str[i]++改变一个“A”到“B”或“E”到“F”,等...

另外,我想建议不要使用str[i] != '\0'。我们使用标准库字符串而不是C字符串是有原因的,所以我们不妨使我们的生活更轻松并使用str.size()。沿着这些相同的路线,我会建议str.at(i)而不是str[i],因为前者会为我们做边界检查。

最后,如果您包含cctype,那么我们可以使用isalpha函数来确保我们只修改字母字符(无数字或空格等)。

因此,你的第一环就呈现:

for (int i = 0; i < str.size(); i++) { 
    if(isalpha(str.at(i)){ 
     if(str.at(i) == 'z') str.at(i) = 'a'; //special case 
     else str.at(i)++; 
    } 
} 

至于你的第二个循环,你甚至都不需要它!我们实际上可以将所有内容直接纳入第一个。只要我们确保在之后做元音修改,我们已经更改了单个字母。

也可以用一些ASCII数学转换从小写到大写。小写字母和大写字母之间的区别是'A'-'a',所以如果我们将其添加到任何小写字母,它会给我们它的大写版本!

有了这一切,我们可以修改代码以:

for (int i = 0; i < str.size(); i++) { 
    if(isalpha(str.at(i)){ //Make sure it's a letter! 
     if(str.at(i) == 'z') str.at(i) = 'a'; //special case 
     else str.at(i)++; 

     if(str.at(i) == 'a' | str.at(i) == 'e' | str.at(i) == 'i' 
      | str.at(i) == 'o' | str.at(i) == 'u') { 
      str.at(i) += 'A' - 'a'; 
    } 
} 

你的主要

这里只有一件事要在这里解决。请勿使用gets进行输入。如果您要查找单个单词,请使用提取操作符>>,或者如果您想要整行,请使用getline。

string word, line; 

getline(cin, line); 
cin >> word; 

cout << LetterChanges(line) << endl; 
cout << LetterChanges(word) << endl; 
+0

Thankyou非常了解代码和更多的东西也谢谢你,你是一个天才 –

+0

可以请你解释这一行str.at(i)+ ='A' - 'a “; –

+0

@kunalsuryawanshi查看[ASCII表格](http://www.asciitable.com/)。任何小写字母/大写字母对之间的区别是相同的。也就是说,从'b'到'B'的距离与'f'到'F'是一样的......所以如果我们加上那个差别(我选择用a来计算它),即“对任何小写字母的' - 'a',它将变成一个大写字母。如果你不相信我,请亲自尝试与桌子上的数学! – scohe001