求助
实现strncpy函数,让用户输入需要拷贝的字符个数(注意:改程序需要能够正确拷贝中英混合的字符串)。看不懂*target2++ = *target1++;
*target2++ = *target1++;那是什么意思,为什么要两个啊]
#include <stdio.h>
#define MAX 1024
int main()
{
char str1;
char str2;
char *target1 = str1;
char *target2 = str2;
char ch;
int n;
printf("请输入一个字符串到 str1 中:");
fgets(str1, MAX, stdin);
printf("请输入需要拷贝的字符个数:");
scanf("%d", &n);
printf("开始拷贝 str1 的内容到 str2 中...\n");
while (n--)
{
ch = *target2++ = *target1++;
if (ch == '\0')
{
break;
}
if ((int)ch < 0)
{
*target2++ = *target1++;
*target2++ = *target1++;
}
}
*target2 = '\0';
printf("拷贝完毕!\n");
printf("现在,str2 中的内容是:%s\n", str2);
return 0;
} 本帖最后由 無聊 于 2017-6-2 23:06 编辑
对于这种疑问,直接调试就知道怎么回事了;
因为是中文的字符,一个字是占两个字节的,有图为证,如下
首先str1的地址是0012FB80,他/她里面现在什么也没放,全部是CC, 输入"鱼C工作室"之后, 如下图
"鱼C工作室"一共5个字,在内存中占了10个字节(不算后面的0结尾的话),那么也就是说要拷贝2个字的话,就需要拷贝4个字节
而 *target2++ = *target1++;由于每次只拷贝了1个字节,要拷1个字的话需要拷两次
然后就没有然后了
static/image/hrline/3.gif
对,我也奇怪,为什么 (int)ch<0 ,赶紧呼唤大神@人造人 超凡天赐 发表于 2017-6-2 23:05
对,我也奇怪,为什么 (int)ch
char ch = '你';
000D22AEmov byte ptr ,0E3h
printf("%d\n", (int)ch);
000D22B2movsx eax,byte ptr
000D22B6push eax
000D22B7push offset string "%d\n" (0D6B94h)
000D22BCcall _printf (0D134Dh)
000D22C1add esp,8
000D22B2movsx eax,byte ptr
按字节扩展
中文字符按ascii 编码,占两个字节,低字节是一个大于127的数,按字节扩展后以整数输出,就成负的了
超凡天赐 发表于 2017-6-2 23:05
对,我也奇怪,为什么 (int)ch
超凡天赐 发表于 2017-6-2 23:05
对,我也奇怪,为什么 (int)ch
#include <stdio.h>
#define MAX 1024
int main()
{
char str1;
char str2;
char *target1 = str1;
char *target2 = str2;
char ch;
int n;
printf("请输入一个字符串到 str1 中:");
fgets(str1, MAX, stdin);
printf("请输入需要拷贝的字符个数:");
scanf("%d", &n);
printf("开始拷贝 str1 的内容到 str2 中...\n");
while(n--)
{
ch = *target2++ = *target1++;
if(ch == '\0')
{
break;
}
if((int)ch < 0)
{
*target2++ = *target1++;
//*target2++ = *target1++;
}
}
*target2 = '\0';
printf("拷贝完毕!\n");
printf("现在,str2 中的内容是:%s\n", str2);
return 0;
}
人造人 发表于 2017-6-2 23:53
000D22B2movsx eax,byte ptr
按字节扩展
你的姿势水平太高了{:10_297:} 超凡天赐 发表于 2017-6-3 09:51
你的姿势水平太高了
汇编语言而已
^_^ 人造人 发表于 2017-6-3 10:18
汇编语言而已
^_^
我从ASCII表上并没有看到中文字符啊啊? 超凡天赐 发表于 2017-6-3 10:52
我从ASCII表上并没有看到中文字符啊啊?
页:
[1]