我正在使用哈佛的CS50设备并尝试将字符设为小写.我正在尝试使用该tolower()
功能,但当我尝试使用它时,我收到了消息implicit declaration of function 'tolower' is invalid in C99
.任何人都在关注为什么我会收到这条消息.我已经包括stdio.h
,以及string.h
.
我正在尝试将字符串转换为小写,并将其视为char*并迭代每个索引.问题是tolower
我在网上读到的函数实际上并没有将char转换为小写:它将char作为输入并返回一个整数.
cout << tolower('T') << endl;
Run Code Online (Sandbox Code Playgroud)
116
应该打印时打印到控制台T
.
有没有更好的方法将字符串转换为小写?我在网上看过,大多数消息来源都说"使用tolower
并遍历char数组",这对我来说似乎并不适用.
所以我的两个问题是:
tolower
当我打电话时,它使得它返回116而不是't' 的功能我做错了什么tolower('T')
除了tolower
在每个单独的字符上使用之外,还有更好的方法将字符串转换为C++中的小写字母吗?
给出以下代码:
void parseInput(fstream &inputFile) {
const int LENGTH = 81;
char line[LENGTH];
while(!inputFile.fail()) {
inputFile.getline(line,LENGTH);
line = tolower(line);
cout << line << endl;
}
}
Run Code Online (Sandbox Code Playgroud)
编译时我收到此错误:
错误E2285:在函数parseInput(fstream&)中找不到'tolower(char*)'的匹配项
我知道它返回一个int,但不是int [],这是否意味着我不应该使用getline来获取字符的输入字符?有没有办法将整行转换为更低?在此先感谢大家的帮助!
我有一个 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)
文字似乎没有改变。谢谢。
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) 当我在c ++中尝试使用非英语字符的tolower()时,它无法正常工作.我搜索了这个问题,但我发现了一些关于语言环境的内容,但我不确定最佳解决方案.
我的示例代码如下:
printf("%c ",tolower('Ü'));
Run Code Online (Sandbox Code Playgroud) 我在工作的前六个月编程,我仍然对标准和最佳实践有感觉。
在进行字符串或字符比较时,是使用 ToUpper 比较大写字符还是使用 ToLower 比较小写字符更常见?我可能更频繁地看到大写字母,但我一直在寻找更明确的答案,也许还有冗长的优化解释(较低的 ASCII 代码,无论如何)。
旁白:在我当前的任务中,我使用 string#replace 并且我的新字符串将是小写的以提高可读性,但这是否一定意味着我应该在我的源字符串和我正在寻找的子字符串上使用 ToLower?
我已经读过,在您的应用程序中,您进行了大量的字符串比较并使用ToLower方法,这种方法非常昂贵.我想知道有谁可以向我解释它是多么昂贵.非常感谢任何信息或解释.谢谢!
我正在使用一个 ldap 对象,我正在从 Activedirectory 检索一些条目。结果是以大写形式返回领域的方式,例如CN=bob,DC=example,DC=com
代替cn=bob,dc=example,dc=com
。有没有办法有选择地将CN
和DC
子字符串转换为小写?到目前为止,我strings.split
多次使用(首先使用“,”,然后再次使用“=”进行迭代)以达到可以将 CN、DC 等放入列表的程度,然后对它们使用 strings.ToLower。有没有更好更聪明的方法来完成这项工作,可能使用正则表达式,以便我可以避免两次迭代?
我有一个包含一些单词的 .txt 文件,我需要它们是小写的。如何将每个单词变成小写?仅将 tolower() 添加到 strtok() 是行不通的。我应该添加什么?或者也许首先在整个文件上使用 tolower() 会更容易?但如何呢?请帮忙!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//#include <ctype.h>
int main(void)
{
char str[5000];
char *ptr;
char *words[5000];
FILE * fp = fopen("hi.txt", "r");
fgets(str, 49, fp);
ptr = strtok(str, ",.; ");
int i = 0;
while(ptr != NULL)
{
words[i]= ptr;
i++;
ptr = strtok(NULL, ",.; ");
}
fclose(fp);
for(int j=0;j<i;j++) {
printf("%s\n", words[j]);
//printf("%s\n", tolower(words[j])); // Doesn't work!
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
例子:
你好.txt
Foo;
Bar.
Baz.
Run Code Online (Sandbox Code Playgroud)
预期产出
foo
bar …
Run Code Online (Sandbox Code Playgroud)