neil123 发表于 2017-6-2 22:09:17

求助

实现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:04:14

本帖最后由 無聊 于 2017-6-2 23:06 编辑

对于这种疑问,直接调试就知道怎么回事了;
因为是中文的字符,一个字是占两个字节的,有图为证,如下


首先str1的地址是0012FB80,他/她里面现在什么也没放,全部是CC, 输入"鱼C工作室"之后, 如下图


"鱼C工作室"一共5个字,在内存中占了10个字节(不算后面的0结尾的话),那么也就是说要拷贝2个字的话,就需要拷贝4个字节
而 *target2++ = *target1++;由于每次只拷贝了1个字节,要拷1个字的话需要拷两次
然后就没有然后了

static/image/hrline/3.gif


超凡天赐 发表于 2017-6-2 23:05:34

对,我也奇怪,为什么 (int)ch<0 ,赶紧呼唤大神@人造人

人造人 发表于 2017-6-2 23:53:35

超凡天赐 发表于 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:55:34

超凡天赐 发表于 2017-6-2 23:05
对,我也奇怪,为什么 (int)ch

人造人 发表于 2017-6-2 23:58:00

超凡天赐 发表于 2017-6-2 23:05
对,我也奇怪,为什么 (int)ch

人造人 发表于 2017-6-3 06:26:23

#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-3 09:51:19

人造人 发表于 2017-6-2 23:53
000D22B2movsx       eax,byte ptr
按字节扩展



你的姿势水平太高了{:10_297:}

人造人 发表于 2017-6-3 10:18:39

超凡天赐 发表于 2017-6-3 09:51
你的姿势水平太高了

汇编语言而已
^_^

超凡天赐 发表于 2017-6-3 10:52:25

人造人 发表于 2017-6-3 10:18
汇编语言而已
^_^

我从ASCII表上并没有看到中文字符啊啊?

人造人 发表于 2017-6-3 11:07:46

超凡天赐 发表于 2017-6-3 10:52
我从ASCII表上并没有看到中文字符啊啊?


页: [1]
查看完整版本: 求助