将所有小写字母大写的程序不起作用
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 << 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"-> 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
语言标准作为编译字符串的一部分并包含所有标题?如果您的编译器没有提供<algorithms>
标头(例如,如果您使用的是DevC++),那么您可能仅限于使用我刚刚作为编辑包含的for
循环示例——或者您可能必须使用字符串::iterator 如果您没有基于范围的 for
循环。
我对此很陌生,我不确定如何处理“-std=c++11”。我正在使用代码块。
对代码块没问题,您可能将 MinGW 作为编译器。等一下,我会告诉你在哪里包含标准。 (我要启动一台windows机器)
太棒了。总有一个解决方案——祝你的编码好运!您还可以查看What is the difference between C++0x and C++11? 以更好地了解语言标准的差异。以上是关于将所有小写字母大写的程序不起作用的主要内容,如果未能解决你的问题,请参考以下文章