首页 > 解决方案 > 如何使用标准库将字符串转换为大写?

问题描述

我正在尝试使用for带有 ASCII 表的循环通过用 32 减去字母数字来使字符串中的每个字符一个一个大写。但我不能i在 charstrstr2. 我怎样才能做到这一点?

#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;
}

标签: c

解决方案


您可以一次使用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()对于负值(例如'é'和)具有未定义的行为'ÿ'


推荐阅读