C++ 功能有什么问题

C++ 功能有什么问题,c++,C++,这个函数应该返回一个单次出现的大写字母 我试图在30分钟内找出一个错误,但我真的不知道问题出在哪里。谁能看看这个吗 #include <algorithm> #include <string> using namespace std; char singleOccurrence(string str) { transform(str.begin(), str.end(), str.begin(), ::toupper); sort(str.begin(

这个函数应该返回一个单次出现的大写字母


我试图在30分钟内找出一个错误,但我真的不知道问题出在哪里。谁能看看这个吗

#include <algorithm>
#include <string>

using namespace std;

char singleOccurrence(string str) {
    transform(str.begin(), str.end(), str.begin(), ::toupper);
    sort(str.begin(), str.end());
    for(int i=0; i<str.length(); i++) {
        if(i==str.length()-1)
            return str[i];
        else if(str[i] != str[i+1])
            return str[i];
    }
}

int main()
{
   string str = "ala";
   cout << singleOccurrence(str);
}
这个if-else语句

    if(i==str.length()-1)
    {
      return str[i];
    }
    else
      if(str[i] != str[i+1])
      {
        return str[i];
      } 
没有道理

例如考虑字符串s= AAB。As s[1]!=s[2]函数将返回字母“a”,尽管它在字符串中出现了多次

或者考虑另一个像AAA这样的字符串。在这种情况下,函数将再次返回字母“a”

如果希望使用具有已排序字符序列的方法,则可以在函数中使用标准容器std::map,而无需对传递的字符串本身进行排序

否则,可以对原始字符串使用嵌套for循环

在这两种情况下,函数应该声明为

char singleOccurrence( const std::string &str );

例如,如果字符串中没有此类字符,则可以返回字符“\0”

在else语句之后,您应该放置和{,idk,如果这可能是一个问题。其次,if不返回不同的内容,在这两种情况下,您都返回str[i]第三,我没有看到包含iostream库,如果您想使用cout或CIN读取输入,请不要忘记包含。此外,您在main中调用此函数一次,它将在字母排序后始终为您提供第一个字母。您可以尝试使用map,它在map库的STL中实现。在map中,您可以从m该字符串作为键,键值将是出现的次数


我希望这有帮助!:

听起来你可能需要学习如何使用调试器来逐步完成代码。有了一个好的调试器,你可以逐行执行你的程序,看看它偏离了你的预期。如果你要做任何编程,这是一个必不可少的工具。进一步阅读:我试图找到一个错误f或者30分钟,我真的不知道。你用了什么技巧来寻找错误?我想看看一些统计数据,询问者声称花了多少时间来寻找问题,30分钟是你应该在调试器中找到的最短时间:i:1,str[i]:'A'str[i+1]:'L'。现在,在ifstr[i]!=str[i+1]上抢夺一笔{return str[i];}.Spoiler:return str[i+1];无法修复它。@Bathsheba我大体上同意,但str[str.size]为元素提供std::string::c_str所需的“\0”不是事实吗?在这种特殊情况下,它甚至可以工作,尽管我在生产性工作中不会依赖它。
char singleOccurrence( std::string_view str );
if(i==str.length()-1)
    {
      return str[i];
    }
    else
      if(str[i] != str[i+1])
      {
        return str[i];
      } 
  }
#include <algorithm>
#include <iostream>
#include <string>
#include <map>

using namespace std;
// char singleOccurrence(string str)
// {
//   transform(str.begin(), str.end(), str.begin(), ::toupper);
//     sort(str.begin(), str.end());
//       for(int i=0; i<str.length(); i++)
//       {
//         if(i==str.length()-1)
//         {
//           return str[i];
//         }
//         else
//           if(str[i] != str[i+1])
//           {
//             return str[i];
//           } 
//       }
// }


int main()
{
   map<char, int> occurrences;//declare a map, your key will be a char and you key value an int
   string str="ala";
   for(int i = 0; i < str.length(); i++){
    occurrences[str[i]]++;
   }
   for(auto n : occurrences){
    cout<<n.first<<" "<<n.second<<endl;//n will be an iterator, you use iterators to get map values 
   }//if you want to check the number and show only the letter with a single occurrence just add an if statement and check in key value (n.second) is equal to one
}