我使用C编写了一个将大写字母转换为小写字母的函数.

#include <stdio.h>
#include <stdlib.h>

//İi Iı Ğğ Şş Çç Üü Öö
char toUpLow(char letter)
{
    if (letter >= 'A' && letter <= 'Z') {
        return letter - 'A' + 'a';
    }
    else if (letter >= 'a' && letter <= 'z') {
        return letter - 'a' + 'A';
    }
    else {
        return -1;
    }
}

int main()
{
    char myChar;
    printf("Enter a character: ");
    scanf("%c", &myChar);
    printf("%c", toUpLow(myChar));

    return 0;
}

我想加上土耳其字母.

char toUpLow(char letter)
{
    if (letter == 'İ') {
        printf("i");
    }
    else if (letter == 'i')
    {
        printf("İ");
    }
    else if (letter == 'I')
    {
        printf("ı");
    }
    else if (letter == 'ı')
    {
        printf("I");
    }
    else if (letter == 'Ğ')
    {
        printf("ğ");
    }
    else if (letter == 'ğ')
    {
        printf("Ğ");
    }
    else if (letter >= 'A' && letter <= 'Z') {
        return letter - 'A' + 'a';
    }
    else if (letter >= 'a' && letter <= 'z') {
        return letter - 'a' + 'A';
    }
    else {
        return -1;
    }
}

我try 添加土耳其字母与if / else,我得到了这个错误:

uplowfunction.c:22:24: warning: multi-character character constant [-Wmultichar]

有办法做到这一点吗?

推荐答案

该错误消息指示您没有对土耳其字母使用单字节编码,如ISO8859-9、Windows代码页1254或MS/DOS代码页857.您可以对Unicode代码点使用UTF-8编码,其中非ASCII字符使用2到4个字节的序列表示.

非ASCII字符不能用于字符常量,或者更准确地说,should不能用于字符常量,因为它们将被解析为容易出错且不可移植的多字符常量.

要转换UTF-8字符串中的大小写,您应该使用宽字符或转换完整的字符串,而不是单个字符.请注意,转换后的字符串的长度可能与原始字符串的长度不同:strlen("İ") != strlen("i")

以下是一个过于简单的实现:

#include <stdlib.h>
#include <string.h>

static const char * const tcase[] = {
    "İ", "I",
    "I", "ı",
    "ğ", "Ğ",
    // ...
};

char *conver_case_turkish(const char *s) {
    size_t len = strlen(s);
    size_t i = 0, j = 0, k;
    size_t ncase = sizeof(tcase) / sizeof(*tcase);
    char *dest = malloc(len * 2 + 1);

    if (dest) {
        while (i < len) {
            char c = s[i];
            if (c >= 'A' && c <= 'Z' && c != 'I') {
                dest[j++] = c - 'A' + 'a';
                i++;
            } else
            if (c >= 'a' && c <= 'z' && c != 'i') {
                dest[j++] = c - 'a' + 'A';
                i++;
            } else {
                for (k = 0; k < ncase; k++) {
                     size_t len1 = strlen(tcase[k]);
                     size_t len2 = strlen(tcase[k ^ 1]);
                     if (!strncmp(s + i, tcase[k], len1)) {
                         strcpy(dest + j, tcase[k ^ 1]);
                         i += len1;
                         j += len2;
                         break;
                     }
                }
                if (k == ncase) {
                    dest[j++] = c;
                    i++;
                }
            }
        }
        dest[j] = '\0';
    }
    return dest;
}

C++相关问答推荐

修改pGM使用指针填充2-D数组但不起作用

Apple Libm的罪恶功能

有效地计算由一组点构成的等边三角形和等腰三角形的数量

需要大整数和浮点数.使用long long int和long double

返回一个包含数组的 struct

C中函数类型的前向声明

如何将常量char*复制到char数组

使用scanf在C中读取和存储文件中的值

限制不同类型的限定符

如何在下面的C代码中正确管理内存?

如何在C++中处理按键

静态初始化顺序失败是否适用于C语言?

程序如何解释变量中的值

macos/arm64 上地址空间不使用第一位吗?

为什么 int32_t 和 int16_t 在 printf 输出中具有相同的位数?

System V 消息队列由于某种原因定期重置

为什么写入关闭管道会返回成功

在 C 中传递参数时出现整数溢出

Makefile - 将 .o 文件放入子文件夹中

在链表中插入一个值