|  | 
 
 发表于 2023-5-1 20:43:20
|
显示全部楼层 
| 这个输出结果的问题在于,被复制到str2中的中文字符是以两个连续的“?”表示的(即"�"),而不是实际的中文字符。这是因为 printf 无法正确输出UTF-8编码的中文字符串("\xe9\xb1\xbc\xe5\xc|\x67\xe4\xbd\x9c\xe5\xae\xa4"),而将其识别为ASCII字符集中不存在的一些字符,显示成了“?”。 
 要解决这个问题,可以使用宽字符类型和对应的printf函数wprintf()来输出宽字符的内容。以下是对代码的修改:
 
 
 复制代码#include <stdio.h>
#include <string.h>
#define MAX 1024
int main()
{
    wchar_t str1[MAX];
    wchar_t *pstr1 = str1;
    int num, length;
    wprintf(L"请输入一个字符串到 str1 中:");
    fgetws(str1, MAX, stdin);
    wprintf(L"开始拷贝 str1 的内容至 str2 中...\n\n");
    wprintf(L"请输入需要拷贝的字符个数:");
    scanf("%d", &length);
    wchar_t str2[length];
    wchar_t *pstr2 = str2;
    for (num = 0; num < length; num++, pstr1++, pstr2++) {
        *pstr2 = *pstr1;
        if (*pstr1 < 0) {
            *pstr2 = *pstr1;
            *pstr2 = *pstr1;
        }
    }
    *pstr2 = L'\0';
    wprintf(L"拷贝完毕!现在 str2 中的内容是:%ls", str2);
    return 0;
}
需要注意的是,对于宽字符类型,以L开头的字母作为前缀表示。同时,输入字符也需要使用fgetws()函数获取。输出时,可以使用wprintf()和占位符%ls来打印宽字符类型的字符串。
 | 
 |