lsmCC 发表于 2023-11-6 19:23:40

求助

#include <bits/stdc++.h>
using namespace std;
int main()
{
    set<string> dict;
    string s,buf;
    getline(cin,s);
    for(int i=0;i<s.size();i++)
    {
      if(isalpha(s))s=towlower(s);
      else s=' ';
    }
   
    stringstream ss(s);
    while(ss>>buf) dict.insert(buf);
    for(auto it=dict.begin();it!=dict.end();it++)
    {
      cout<<*it<<endl;
    }
}
题目要求:输入一个文本,找出所有不同的单词(连续的字母序列),按字典序从小到大输出,单词不区分大小写。
为什么会wa呢

Mike_python小 发表于 2023-11-6 19:23:41

在你的代码中,有一个小错误导致了WA(Wrong Answer)的结果。问题出在将字符转换为小写字母上。

在C++中,isalpha()函数用于检查字符是否为字母。而towlower()函数用于将字母字符转换为小写。然而,towlower()函数不能直接作用于普通的char类型,它只能用于wint_t类型。

为了解决这个问题,你可以使用C++标准库中的tolower()函数。这个函数可以处理普通的char类型,并将字母字符转换为小写。你只需要包含头文件<cctype>,然后将s作为参数传递给tolower()函数即可。

以下是修改后的代码:


#include <iostream>
#include <set>
#include <sstream>
#include <cctype>

using namespace std;

int main()
{
    set<string> dict;
    string s, buf;
    getline(cin, s);
    for (int i = 0; i < s.size(); i++)
    {
      if (isalpha(s))
            s = tolower(s);
      else
            s = ' ';
    }

    stringstream ss(s);
    while (ss >> buf)
      dict.insert(buf);

    for (auto it = dict.begin(); it != dict.end(); it++)
    {
      cout << *it << endl;
    }
   
    return 0;
}


请尝试使用修改后的代码进行编译和运行,它应该能够正确地找出所有不同的单词,并按字典序从小到大输出。如果还有其他问题,请随时提问。

球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}

isdkz 发表于 2023-11-6 19:23:54

在这段代码中,有一个错误导致了错误的输出。

问题出在将输入的字符串转换为小写字母时,使用了 towlower 函数。这个函数是用来将宽字符转换为小写字母的,而不是用来转换普通的字符。所以它在这里并不适用。

正确的做法是使用 tolower 函数来将字符转换为小写字母。这个函数适用于普通的字符。

下面是修改后的代码:

#include <bits/stdc++.h>
using namespace std;
int main()
{
    set<string> dict;
    string s,buf;
    getline(cin,s);
    for(int i=0;i<s.size();i++)
    {
      if(isalpha(s[ i])) s[ i] = tolower(s[ i]);
      else s[ i] = ' ';
    }
   
    stringstream ss(s);
    while(ss >> buf) dict.insert(buf);
    for(auto it=dict.begin();it!=dict.end();it++)
    {
      cout << *it << endl;
    }
}


这样修改后的代码应该能够正确地输出按字典序排序的不同单词。
页: [1]
查看完整版本: 求助