编辑代码

#include <stdio.h>
#include <ctype.h> // 包含 isprint 函数

int main() {
    char str[100];
    int i = 0;
    int count = 0;

    printf("请输入一段字符串:");
    if (fgets(str, sizeof(str), stdin) != NULL) {
        // 遍历字符串中的每个字符
        while (str[i] != '\0') {
            // 检查当前字符是否为可打印字符
            if (isprint(str[i])) {
                // 如果是单字节的 ASCII 字符(最高位为 0)
                if ((str[i] & 0x80) == 0) {
                    count++; // 计数加 1
                    i++; // 移动到下一个字符
                }
                // 如果是 UTF-8 编码的多字节字符的起始字节(最高三位为 1110)
                else if ((str[i] & 0xE0) == 0xE0) {
                    count++; // 计数加 1
                    i += 3; // 跳过后续的 2 个字节
                }
                
            } 
            else {
                // 如果是无效字符(如换行符、空格等),跳过
                i++;
            }
        }
        // 输出结果
        printf("%s", str); // 输出原始字符串
        printf("这串字符的有效长度为:%d\n", count); // 输出有效字符的长度
    } else {
        printf("读取失败。\n");
    }
    return 0;
}