c - 如何使用标准库将字符串转换为大写?
问题描述
我正在尝试使用for
带有 ASCII 表的循环通过用 32 减去字母数字来使字符串中的每个字符一个一个大写。但我不能i
在 charstr
和str2
. 我怎样才能做到这一点?
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#define STRLEN 200
void string_lower() {
}
void string_upper(char str) {
char str2;
int length = strlen(str);
for (int i = 0; i < length; i++) {
str2[i] = str[i - 32];
}
}
int main() {
char word[STRLEN] = { 0 };
char word1 = 97;
printf("Write a word");
fgets(word, STRLEN, stdin);
string_upper(word);
return 0;
}
解决方案
您可以一次使用toupper()
大写一个字符。这将适用于单字节字符集,例如 ASCII,但不适用于当今普遍用于非英语脚本的 UTF-8 编码。
这是修改后的版本:
#include <ctype.h>
#include <stdio.h>
#define STRLEN 200
char *string_upper(char *str) {
for (size_t i = 0; str[i] != '\0'; i++) {
str[i] = toupper((unsigned char)str[i]);
}
return str;
}
int main() {
char word[STRLEN];
printf("Enter a word: ");
if (fgets(word, STRLEN, stdin)) {
printf("%s", string_upper(word);
}
return 0;
}
参数必须强制转换为,(unsigned char)str[i]
因为str[i]
has typechar
并且tolower()
像所有函数和宏一样 from<ctype.h>
只为 typeunsigned char
的值和特殊的负值定义EOF
。由于char
可能在某些平台上签名,将其直接传递给tolower()
对于负值(例如'é'
和)具有未定义的行为'ÿ'
。
推荐阅读
- reactjs - Redux Toolkit RTK Query 发送查询参数
- flutter - TextField 导致“查找已停用小部件的祖先是不安全的。” 扑
- unreal-engine4 - UE4 Importing ArchViz Interior project becomes too bright
- javascript - 如何从节点js中的函数返回多个参数,一个作为接口,另一个作为变量
- ios - ExtensionDelegate.swift 未调用
- user-interface - 如何通过提供 UI 设施来测试 Laravel 黄昏?
- qt - QSQLite 查询在 QSQLite Studio 中执行,但在 QT 中执行时出错
- json - Laravel 8 在 eloquent 查询中获取 SQL 错误,同时获取两个相关表的嵌套 JSON 响应
- plot - Julia 绘图功能停止正常工作
- rust - Rust 标准基准测试模块`未解决的导入`crate::some_module`