在自定义库中,我看到了一个实现:
inline int is_upper_alpha(char chValue)
{
if (((chValue >= 'A') && (chValue <= 'I')) ||
((chValue >= 'J') && (chValue <= 'R')) ||
((chValue >= 'S') && (chValue <= 'Z')))
return 1;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是复活节彩蛋还是与标准C/C++方法相比有哪些优势?
inline int is_upper_alpha(char chValue)
{
return ((chValue >= 'A') && (chValue <= 'Z'));
}
Run Code Online (Sandbox Code Playgroud) 不久之前,StackOverflow上有一个声誉很高的人在评论中写道,在调用(和类似的函数)之前必须抛出一个char
-argument .unsigned char
std::toupper
另一方面,Bjarne Stroustrup没有提到在C++ - Programming Language中这样做的必要性.他只是std::tolower
喜欢用
string name = "Niels Stroustrup";
void m3() {
string s = name.substr(6,10); // s = "Stroustr up"
name.replace(0,5,"nicholas"); // name becomes "nicholas Stroustrup"
name[0] = toupper(name[0]); // name becomes "Nicholas Stroustrup"
}
Run Code Online (Sandbox Code Playgroud)
(引用自该书,第4版.)
参考文献说输入需要表示为toupper
.对我来说,这听起来像每个unsigned char
以后都有,char
并且char
具有相同的大小.
那么这个演员是不必要的还是Stroustrup不小心?
编辑:libstdc ++手册提到输入字符必须来自基本源字符集,但不会强制转换.我想这是由@Keith Thompson的回复所涵盖的,他们都有积极的表现unsigned char
和signed char
?
鉴于代码:
#include <iostream>
#include <cctype>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
string s("ABCDEFGHIJKL");
transform(s.begin(),s.end(),s.begin(),tolower);
cout<<s<<endl;
}
Run Code Online (Sandbox Code Playgroud)
我收到错误:
呼叫没有匹配功能
transform(__gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, <unresolved overloaded function type>)
什么是"未解决重载函数类型"是什么意思?
如果我用tolower
我写的函数替换它,它不再是错误.
在C中,字符串是char(char *
)数组,字符通常存储在其中char
.我注意到libC中的一些函数将作为参数整数而不是char.
例如,让我们的职能toupper()
和tolower()
两个使用int
.手册页说:
如果c不是无符号字符值或EOF,则这些函数的行为是未定义的.
我的猜测是,有一个int
,toupper
并且tolower
能够处理unsigned char
和EOF
.但实际上EOF
是在实践中(有没有关于它的值的规则?)一个可以用a存储的值char
,并且由于这些函数不会转换EOF
成其他东西,我想知道为什么toupper
不简单地将char作为参数.
在任何情况下,为什么我们需要接受不是字符的东西(例如EOF)?有人能为我提供相关的用例吗?
这与fputc
或类似putchar
,也可以将int
其转换为unsigned char
无论如何.
我正在寻找这种选择的确切动机.我想说服,我不想回答,我不知道有一天有人问我.
在.NET Framework中使用字符串的最佳实践中,OrdinalIgnoreCase
建议将StringComparison 用于不区分大小写的文件路径.(我们称之为声明A.)
我同意这一点,因为我可以在同一目录中创建两个文件:
é.txt
e?.txt
Run Code Online (Sandbox Code Playgroud)
它们的文件名不一样,第二个是由e
和修饰符组成的,所以它实际上有两个字母.(您可以尝试使用复制粘贴.)
如果有不变的文化比较(而不是序数比较),NTFS将不允许这些文件,因为在他们解释的同一篇文章中,在不变的文化中 a + ? = å
但在文章中String.ToUpperInvariant()
有不同的建议:(声明B.)
如果需要操作系统标识符的小写或大写版本(例如文件名,命名管道或注册表项),请使用ToLowerInvariant或ToUpperInvariant方法.
我需要创建文件路径集合(实际上HashSet
)来检测重复项.因此,如果创建地图的时候,我会服从声明B,我可以误报结束,因为上述文件名é.txt
和e?.txt
将被视为一个.我是否正确理解MSDN中的语句B具有误导性?或者我错过了什么?
我即将建立一个库,最好从开始时没有已知的错误,所以我根本不想忽略这一点.
更新:
语句B似乎还有一个问题:ToLowerInvariant()无法实际使用.原因(我引用的最佳实践的文章):DO: Use ToUpperInvariant rather than ToLowerInvariant when normalizing strings for comparison.
实际的理由: There is a small range of characters that do not roundtrip, and going to lowercase will make these characters unavailable.
(源)
同事,
我正在查看类似于以下摘录的数据框:
Month Provider Items
January CofCom 25
july CofCom 331
march vobix 12
May vobix 0
Run Code Online (Sandbox Code Playgroud)
我想将每个单词的首字母大写,并降低每个单词的剩余字母.这将导致数据框类似于下面的数据框:
Month Provider Items
January Cofcom 25
July Cofcom 331
March Vobix 12
May Vobix 0
Run Code Online (Sandbox Code Playgroud)
总之,我正在寻找R等同于MS Excel中可用的ROPER功能.
说我有一个字符串.
该字符串可以更改它包含的字符.
例如 word = "UPPER£CASe"
我如何测试字符串以查看字符串中的任何字符是否不是大写的.此字符串必须只包含大写字母,不能包含其他标点符号,数字,小写字母等.
我有一个 char foo[SIZE]; //(string)
并使用正确输入%s
(如printfs
正确输入),但现在要将其设置为小写。所以我尝试使用
if (isupper(*foo))
*foo=tolower(*foo);
Run Code Online (Sandbox Code Playgroud)
即当我这样做:
printf("%s" foo); //I get the same text with upper case
Run Code Online (Sandbox Code Playgroud)
文字似乎没有改变。谢谢。
我正在尝试为酒店创建一个程序,用户输入一个字符(S,D或L),并且该字符应该与下一行的代码相对应.我需要帮助转换用户输入(无论他们输入什么方式)转换为大写,然后我可以使用if
语句来做我需要做的事情.到目前为止,我的代码如下:
public static void Main()
{
int numdays;
double total = 0.0;
char roomtype, Continue;
Console.WriteLine("Welcome to checkout. We hope you enjoyed your stay!");
do
{
Console.Write("Please enter the number of days you stayed: ");
numdays = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("S = Single, D = Double, L = Luxery");
Console.Write("Please enter the type of room you stayed in: ");
roomtype = Convert.ToChar(Console.ReadLine());
**^Right Her is Where I Want To Convert To Uppercase^**
total = RoomCharge(numdays,roomtype);
Console.WriteLine("Thank you for staying at …
Run Code Online (Sandbox Code Playgroud) std::transform
从 C++20 开始,声明constexpr.
我有一堆带std::string
参数的字符串实用函数,但很多用法最终只是在编译时传递小而短的字符文字序列。constexpr
我想我会利用这个事实并声明 和take s的版本,std::string_view
而不是创建临时std::string
变量只是为了扔掉它们......
原始STD::STRING
版本:
[[nodiscard]] std::string ToUpperCase(std::string string) noexcept {
std::transform(string.begin(), string.end(), string.begin(), [](unsigned char c) -> unsigned char { return std::toupper(c, std::locale("")); });
return string;
}
Run Code Online (Sandbox Code Playgroud)
新STD::STRING_VIEW
版本:
[[nodiscard]] constexpr std::string_view ToUpperCase(std::string_view stringview) noexcept {
std::transform(stringview.begin(), stringview.end(), stringview.begin(), [](unsigned char c) -> unsigned char { return std::toupper(c, std::locale("")); });
return stringview;
}
Run Code Online (Sandbox Code Playgroud)
但 MSVC 抱怨道:
error C3892: '_UDest': you cannot assign to a …
Run Code Online (Sandbox Code Playgroud)