鱼C论坛

 找回密码
 立即注册
查看: 2654|回复: 11

[已解决]strcat和strncat的顺序的影响

[复制链接]
发表于 2018-5-5 22:36:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
为何同一个字符串在strncat的前后输出结果会不一样;
代码如下图:

代码

代码

输出结果如下图:

输出结果

输出结果
最佳答案
2018-5-10 14:41:02
我理解了,画了一张图,不知道你能不能理解
无标题.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-5-6 22:22:38 From FishC Mobile | 显示全部楼层
倒数第三行去掉试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-7 11:52:36 | 显示全部楼层
lovefishc.com 发表于 2018-5-6 22:22
倒数第三行去掉试试

我有一个打印错误  第二个printf 括号内应该是 ("str1: %s\n",str1);
我想知道为什么strncat对str1没有进行操作, 但是前后两次输出str1为什么会不一样?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-7 12:04:39 From FishC Mobile | 显示全部楼层
是不是内存中线性存储的问题,俺也理解的也不是很清楚
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-7 16:26:57 From FishC Mobile | 显示全部楼层
倒数第三行把16改成9,,,越界了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-8 22:50:43 | 显示全部楼层
lovefishc.com 发表于 2018-5-7 16:26
倒数第三行把16改成9,,,越界了


                               
登录/注册后可看大图


                               
登录/注册后可看大图

str1的结果还是这样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-10 11:58:23 From FishC Mobile | 显示全部楼层
为什呀?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-10 12:40:46 | 显示全部楼层
看反汇编吧,如果看不懂,那就等学完汇编语言以后,再回来看
   1                              .file        "main.c"
   9                      .Ltext0:
  10                              .cfi_sections        .debug_frame
  11                              .section        .rodata
  12                      .LC2:
  13 0000 2000                     .string        " "
  14                      .LC3:
  15 0002 73747231                 .string        "str1: %s\n"
  15      3A202573 
  15      0A00
  16                      .LC4:
  17 000c 73747233                 .string        "str3: %s\n"
  17      3A202573 
  17      0A00
  18                      .LC0:
  19 0016 796F7500                 .string        "you"
  20                      .LC1:
  21 001a 446F2079                 .string        "Do you "
  21      6F752000 
  22                              .text
  23                      .globl main
  25                      main:
  26                      .LFB0:
  27                              .file 1 "main.c"
   0:main.c        **** #include <stdio.h>
   1:main.c        **** #include <string.h>
   2:main.c        **** 
   3:main.c        **** int main(void)
   4:main.c        **** {
  28                              .loc 1 5 0
  29                              .cfi_startproc
  30 0000 55                       pushl        %ebp
  31                              .cfi_def_cfa_offset 8
  32                              .cfi_offset 5, -8
  33 0001 89E5                     movl        %esp, %ebp
  34                              .cfi_def_cfa_register 5
  35 0003 83E4F0                   andl        $-16, %esp
  36 0006 83EC30                   subl        $48, %esp
   5:main.c        ****         char str1[] = "I love";
  37                              .loc 1 6 0
  38 0009 C7442429                 movl        $1869357129, 41(%esp)
  38      49206C6F 
  39 0011 66C74424                 movw        $25974, 45(%esp)
  39      2D7665
  40 0018 C644242F                 movb        $0, 47(%esp)
  40      00
   6:main.c        ****         char str2[] = "you";
  41                              .loc 1 7 0
  42 001d A1160000                 movl        .LC0, %eax
  42      00
  43 0022 89442425                 movl        %eax, 37(%esp)
   7:main.c        ****         char str3[] = "Do you ";
  44                              .loc 1 8 0
  45 0026 A11A0000                 movl        .LC1, %eax
  45      00
  46 002b 8B151E00                 movl        .LC1+4, %edx
  46      0000
  47 0031 8944241D                 movl        %eax, 29(%esp)
  48 0035 89542421                 movl        %edx, 33(%esp)
   8:main.c        ****         char str4[] = "love me ?";
  49                              .loc 1 9 0
  50 0039 C7442413                 movl        $1702260588, 19(%esp)
  50      6C6F7665 
  51 0041 C7442417                 movl        $543517984, 23(%esp)
  51      206D6520 
  52 0049 66C74424                 movw        $63, 27(%esp)
  52      1B3F00
   9:main.c        **** 
  10:main.c        ****         strcat(str1, " ");
  53                              .loc 1 11 0
  54 0050 B8000000                 movl        $.LC2, %eax
  54      00
  55 0055 89442404                 movl        %eax, 4(%esp)
  56 0059 8D442429                 leal        41(%esp), %eax
  57 005d 890424                   movl        %eax, (%esp)
  58 0060 E8FCFFFF                 call        strcat
  58      FF
  11:main.c        ****         strcat(str1, str2);
  59                              .loc 1 12 0
  60 0065 8D442425                 leal        37(%esp), %eax
  61 0069 89442404                 movl        %eax, 4(%esp)
  62 006d 8D442429                 leal        41(%esp), %eax
  63 0071 890424                   movl        %eax, (%esp)
  64 0074 E8FCFFFF                 call        strcat
  64      FF
  12:main.c        ****         printf("str1: %s\n", str1);
  65                              .loc 1 13 0
  66 0079 B8020000                 movl        $.LC3, %eax
  66      00
  67 007e 8D542429                 leal        41(%esp), %edx
  68 0082 89542404                 movl        %edx, 4(%esp)
  69 0086 890424                   movl        %eax, (%esp)
  70 0089 E8FCFFFF                 call        printf
  70      FF
  13:main.c        **** 
  14:main.c        ****         strncat(str3, str4, 16);
  71                              .loc 1 15 0
  72 008e 8D442413                 leal        19(%esp), %eax
  73 0092 C7442408                 movl        $16, 8(%esp)
  73      10000000 
  74 009a 89442404                 movl        %eax, 4(%esp)
  75 009e 8D44241D                 leal        29(%esp), %eax
  76 00a2 890424                   movl        %eax, (%esp)
  77 00a5 E8FCFFFF                 call        strncat
  77      FF
  15:main.c        ****         printf("str1: %s\n", str1);
  78                              .loc 1 16 0
  79 00aa B8020000                 movl        $.LC3, %eax
  79      00
  80 00af 8D542429                 leal        41(%esp), %edx
  81 00b3 89542404                 movl        %edx, 4(%esp)
  82 00b7 890424                   movl        %eax, (%esp)
  83 00ba E8FCFFFF                 call        printf
  83      FF
  16:main.c        ****         printf("str3: %s\n", str3);
  84                              .loc 1 17 0
  85 00bf B80C0000                 movl        $.LC4, %eax
  85      00
  86 00c4 8D54241D                 leal        29(%esp), %edx
  87 00c8 89542404                 movl        %edx, 4(%esp)
  88 00cc 890424                   movl        %eax, (%esp)
  89 00cf E8FCFFFF                 call        printf
  89      FF
  17:main.c        **** 
  18:main.c        ****         return 0;
  90                              .loc 1 19 0
  91 00d4 B8000000                 movl        $0, %eax
  91      00
  19:main.c        **** }
  92                              .loc 1 20 0
  93 00d9 C9                       leave
  94                              .cfi_restore 5
  95                              .cfi_def_cfa 4, 4
  96 00da C3                       ret
  97                              .cfi_endproc
  98                      .LFE0:
 100                      .Letext0:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-10 14:41:02 | 显示全部楼层    本楼为最佳答案   
我理解了,画了一张图,不知道你能不能理解
无标题.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-10 22:40:16 | 显示全部楼层
人造人 发表于 2018-5-10 14:41
我理解了,画了一张图,不知道你能不能理解

str1为什么会显示str3后面的内容呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-10 23:03:05 | 显示全部楼层
LordHdy 发表于 2018-5-10 22:40
str1为什么会显示str3后面的内容呢?

在执行 strcat(str1, " "); 之前,内存中是这样的,能理解吗
str4 排在 str3 的前面,str3 排在 str2 的前面

无标题.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-11 10:11:16 From FishC Mobile | 显示全部楼层
人造人 发表于 2018-5-10 23:03
在执行 strcat(str1, " "); 之前,内存中是这样的,能理解吗
str4 排在 str3 的前面,str3 排在 str2 的 ...

非常感谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-1 23:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表