【问题标题】:program to capitalize all lowercase not working将所有小写字母大写的程序不起作用
【发布时间】:2020-01-23 02:36:26
【问题描述】:

一个作业要我创建一个函数,将所有小写字符变为大写。

这是我的代码:

main.cpp:

#include <iostream>
#include "Function.h"//Includes function file in main file
using namespace std;

int main(){
    char a;
    cout<<"Enter some words:";
    cin.get(a);//Collects info from user
    strcap(a);
    cout<<a;
}

function.cpp:

#include <iostream>
#include "Function.h"
using namespace std;

char strcap(char a){
    while (a!='\n'){
        if (a>='a' && a<='z'){
            a-=32;//
        }
        cin.get(a); //get the next letter
    }
}

函数.h:

#include <iostream>

char strcap(char a);

【问题讨论】:

  • 您认为char a; 中可以存储多少个字符?请改用std::basic_string
  • 阅读How to Ask。然后告诉我们你认为你的程序有什么问题?你告诉我们你的任务是什么,但你没有描述你的调试工作或给我们任何输入和输出示例。
  • 这段代码是完全错误的方法。您需要重新开始并采取不同的方法。查看this std::toupper() documentation中提供的示例代码
  • 使用std::toupper 将小写转换为大写。
  • 您正在更改 strcap 中的局部变量并将其丢弃,它从未使用过,从未返回。

标签: c++


【解决方案1】:

虽然您采用的方法接近标准 C 方法,但您没有提供足够的存储空间来读取多个字符。您可以将cin.get(a); strcap(a); cout &lt;&lt; a; 包装在while 循环中,这将是一种在C++ 中大约十年不合适的方法。使用 std::basic::string 可以为您的输入提供自动内存管理,std::transform 可以轻松地将转换应用于容器的所有元素。

std::transform 的示例提供了您所需要的内容,但没有说明如何将操作拆分为单独的头文件和源文件。如果在阅读文档后仍然卡住,您可以执行类似以下的操作。

function.h 的标头只需提供strcap 的声明,例如

#include <string>

void strcap (std::string& s);

您对function.cpp 的实现同样只需要提供strcap 的定义:

#include <cctype>
#include <algorithm>

#include "function.h"

void strcap (std::string& s)
{
    std::transform (s.begin(), s.end(), s.begin(),
                    [](unsigned char c) -> unsigned char { return std::toupper(c); });
}

注意:上面的trailing-return-type"-&gt; unsigned char"可以省略,会正确推导)

您的main.cpp 将是:

#include <iostream>

#include "function.h"

int main (void) {

    std::string s;

    std::cout << "enter string: ";
    if (getline (std::cin, s)) {
        strcap(s);
        std::cout << s << '\n';
    }
}

使用/输出示例

像往常一样编译,但你需要至少-std=c++11的语言标准,然后,例如

$ ./main
enter string: My dog has fleas
MY DOG HAS FLEAS

另外请注意,如果您不想使用std::transform,您可以使用基于范围的for循环来遍历字符串中的每个字符,并将其转换为大写。您的 strcap() 函数将是:

void strcap (std::string& s)
{
    for (auto& c : s)
        c = toupper(c);
}

如果由于某种原因你的编译器不支持 range-based for 循环,那么你也可以使用基本的std::string:iterator 来迭代提供转换的字符串,例如

void strcap (std::string& s)
{
    for (std::string::iterator it = s.begin(); it != s.end(); it++)
        *it = toupper(*it);
}

您可以采取几种不同的方法。

查看一下,如果您有任何其他问题,请告诉我。


Code::Blocks 编译器选项

为了确保我们在同一张纸上,您应该看到:

【讨论】:

  • 谢谢,我实现了你所说的,但我在 function.cpp 中得到了一堆预期的主要表达式错误。
  • 你用的是什么编译器?您是否提供了 -std=c++11 语言标准作为编译字符串的一部分并包含所有标题?如果您的编译器没有提供&lt;algorithms&gt; 标头(例如,如果您使用的是DevC++),那么您可能仅限于使用我刚刚作为编辑包含的for 循环示例——或者您可能必须使用字符串::iterator 如果您没有基于范围的 for 循环。
  • 我对此很陌生,我不确定如何处理“-std=c++11”。我正在使用代码块。
  • 对代码块没问题,您可能将 MinGW 作为编译器。等一下,我会告诉你在哪里包含标准。 (我要启动一台windows机器)
  • 太棒了。总有一个解决方案——祝你的编码好运!您还可以查看What is the difference between C++0x and C++11? 以更好地了解语言标准的差异。
猜你喜欢
  • 2022-01-25
  • 2017-08-26
  • 1970-01-01
  • 2011-01-16
  • 2011-06-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-18
相关资源
最近更新 更多