You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中如何访问字符串中的ß并实现与ss的互转?

德语字符串ß与ss互转的C实现方案

需求与限制

需要实现两个C函数完成以下转换:

  • 将输入字符串中所有德语字符ß转换为ss
  • 反向将字符串中所有连续的ss转换为ß
    转换结果需保存到动态分配的新字符串中。

核心限制:

  • ß在UTF-8编码中占2个字节(字节序列为0xC3 0x9F),无法通过string[x]直接作为单个字符访问
  • 禁止使用C标准字符串库函数(如strlen、strcpy等)

当前代码仅保留了ss的原样输出,未实现ß的识别与转换逻辑,需补充对应功能。


当前代码

#include <string.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include "base.h"

char *sharpStoDoubleS(char *inputString){
    int length = 0;
    //Count the length of string input
    for(char* new = inputString;*new != '\0';new++){
        length++;
    }
    //Result string
    String returned = malloc(length * sizeof(char) + 1);
    for(int a = 0;*inputString != '\0';inputString++, a++){
        if(*(inputString) == 's' && *(inputString + 1) == 's'){
            returned[a] = *inputString;
            a++;
            inputString++;
            returned[a] = *inputString;
        } else{
            returned[a] = *inputString;
        }
    }
    returned[length] = '\0';
    return returned;
}

int main()
{
    char *testString = "Strasse";
    printf("%s\n", sharpStoDoubleS(testString));
    return 0;
}

解决方案

核心思路

由于ß是UTF-8双字节字符,需通过连续两个字节的数值匹配识别它(0xC3 + 0x9F)。同时两种转换会改变字符串长度,因此必须先遍历输入字符串计算转换后的目标长度,再分配对应大小的内存,避免内存溢出或浪费。

1. ß转ss函数实现

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

// 将ß转换为ss
char *eszettToDoubleS(const unsigned char *input) {
    // 第一步:计算转换后的字符串长度
    int target_len = 0;
    const unsigned char *ptr = input;
    while (*ptr != '\0') {
        // 匹配UTF-8编码的ß
        if (*ptr == 0xC3 && *(ptr + 1) == 0x9F) {
            target_len += 2; // 一个ß转成两个s,占2字节
            ptr += 2;
        } else {
            target_len += 1;
            ptr += 1;
        }
    }

    // 分配内存(+1用于存储终止符'\0')
    char *result = (char *)malloc(target_len + 1);
    if (result == NULL) {
        return NULL; // 内存分配失败返回空
    }

    // 第二步:执行转换
    char *res_ptr = result;
    ptr = input;
    while (*ptr != '\0') {
        if (*ptr == 0xC3 && *(ptr + 1) == 0x9F) {
            *res_ptr++ = 's';
            *res_ptr++ = 's';
            ptr += 2;
        } else {
            *res_ptr++ = *ptr++;
        }
    }
    *res_ptr = '\0'; // 添加字符串终止符

    return result;
}

2. ss转ß函数实现

// 将连续的ss转换为ß
char *doubleSToEszett(const unsigned char *input) {
    // 第一步:计算转换后的字符串长度
    int target_len = 0;
    const unsigned char *ptr = input;
    while (*ptr != '\0') {
        // 匹配连续的两个s
        if (*ptr == 's' && *(ptr + 1) == 's') {
            target_len += 2; // ß占2字节
            ptr += 2;
        } else {
            target_len += 1;
            ptr += 1;
        }
    }

    // 分配内存
    char *result = (char *)malloc(target_len + 1);
    if (result == NULL) {
        return NULL;
    }

    // 第二步:执行转换
    char *res_ptr = result;
    ptr = input;
    while (*ptr != '\0') {
        if (*ptr == 's' && *(ptr + 1) == 's') {
            *res_ptr++ = 0xC3;
            *res_ptr++ = 0x9F;
            ptr += 2;
        } else {
            *res_ptr++ = *ptr++;
        }
    }
    *res_ptr = '\0';

    return result;
}

3. 测试示例

int main() {
    // 测试ß转ss
    const unsigned char *test1 = "Straße";
    char *converted1 = eszettToDoubleS(test1);
    if (converted1 != NULL) {
        printf("ß转ss结果:%s\n", converted1);
        free(converted1); // 释放动态分配的内存
    }

    // 测试ss转ß
    const unsigned char *test2 = "Strasse";
    char *converted2 = doubleSToEszett(test2);
    if (converted2 != NULL) {
        printf("ss转ß结果:%s\n", converted2);
        free(converted2);
    }

    return 0;
}

关键注意事项

  • 使用unsigned char遍历字符串,避免字节值大于0x7F时出现符号扩展问题
  • 必须先计算转换后的长度再分配内存,否则会出现内存不足或浪费
  • 转换完成后需手动释放动态分配的字符串,避免内存泄漏
  • 识别ß时必须严格匹配双字节序列0xC3 0x9F,这是UTF-8编码中ß的标准表示

内容的提问来源于stack exchange,提问作者g1e2h3

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 05:04:59