|
发表于 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来打印宽字符类型的字符串。 |
|