将所有小写字母大写的程序不起作用

Posted

技术标签:

【中文标题】将所有小写字母大写的程序不起作用【英文标题】: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 中的局部变量并将其丢弃,它从未使用过,从未返回。 【参考方案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? 以更好地了解语言标准的差异。

以上是关于将所有小写字母大写的程序不起作用的主要内容,如果未能解决你的问题,请参考以下文章

我的正则表达式在 C# 中不起作用

Android大写字符在手机中不起作用

Laravel 不区分大小写的路由

html 属性中的大写字母

Swift仅将.uppercaseString应用于字符串的第一个字母

为啥小写 [i] 在可视块模式下不起作用?