鱼C论坛

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

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

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

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

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

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

代码

代码

输出结果如下图:

输出结果

输出结果
最佳答案
2018-5-10 14:41:02
我理解了,画了一张图,不知道你能不能理解
无标题.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-5-6 22:22:38 From FishC Mobile | 显示全部楼层
倒数第三行去掉试试
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

发表于 2018-5-7 12:04:39 From FishC Mobile | 显示全部楼层
是不是内存中线性存储的问题,俺也理解的也不是很清楚
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-7 16:26:57 From FishC Mobile | 显示全部楼层
倒数第三行把16改成9,,,越界了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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


                               
登录/注册后可看大图


                               
登录/注册后可看大图

str1的结果还是这样
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-10 11:58:23 From FishC Mobile | 显示全部楼层
为什呀?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-10 12:40:46 | 显示全部楼层
看反汇编吧,如果看不懂,那就等学完汇编语言以后,再回来看

  1.    1                              .file        "main.c"
  2.    9                      .Ltext0:
  3.   10                              .cfi_sections        .debug_frame
  4.   11                              .section        .rodata
  5.   12                      .LC2:
  6.   13 0000 2000                     .string        " "
  7.   14                      .LC3:
  8.   15 0002 73747231                 .string        "str1: %s\n"
  9.   15      3A202573
  10.   15      0A00
  11.   16                      .LC4:
  12.   17 000c 73747233                 .string        "str3: %s\n"
  13.   17      3A202573
  14.   17      0A00
  15.   18                      .LC0:
  16.   19 0016 796F7500                 .string        "you"
  17.   20                      .LC1:
  18.   21 001a 446F2079                 .string        "Do you "
  19.   21      6F752000
  20.   22                              .text
  21.   23                      .globl main
  22.   25                      main:
  23.   26                      .LFB0:
  24.   27                              .file 1 "main.c"
  25.    0:main.c        **** #include <stdio.h>
  26.    1:main.c        **** #include <string.h>
  27.    2:main.c        ****
  28.    3:main.c        **** int main(void)
  29.    4:main.c        **** {
  30.   28                              .loc 1 5 0
  31.   29                              .cfi_startproc
  32.   30 0000 55                       pushl        %ebp
  33.   31                              .cfi_def_cfa_offset 8
  34.   32                              .cfi_offset 5, -8
  35.   33 0001 89E5                     movl        %esp, %ebp
  36.   34                              .cfi_def_cfa_register 5
  37.   35 0003 83E4F0                   andl        $-16, %esp
  38.   36 0006 83EC30                   subl        $48, %esp
  39.    5:main.c        ****         char str1[] = "I love";
  40.   37                              .loc 1 6 0
  41.   38 0009 C7442429                 movl        $1869357129, 41(%esp)
  42.   38      49206C6F
  43.   39 0011 66C74424                 movw        $25974, 45(%esp)
  44.   39      2D7665
  45.   40 0018 C644242F                 movb        $0, 47(%esp)
  46.   40      00
  47.    6:main.c        ****         char str2[] = "you";
  48.   41                              .loc 1 7 0
  49.   42 001d A1160000                 movl        .LC0, %eax
  50.   42      00
  51.   43 0022 89442425                 movl        %eax, 37(%esp)
  52.    7:main.c        ****         char str3[] = "Do you ";
  53.   44                              .loc 1 8 0
  54.   45 0026 A11A0000                 movl        .LC1, %eax
  55.   45      00
  56.   46 002b 8B151E00                 movl        .LC1+4, %edx
  57.   46      0000
  58.   47 0031 8944241D                 movl        %eax, 29(%esp)
  59.   48 0035 89542421                 movl        %edx, 33(%esp)
  60.    8:main.c        ****         char str4[] = "love me ?";
  61.   49                              .loc 1 9 0
  62.   50 0039 C7442413                 movl        $1702260588, 19(%esp)
  63.   50      6C6F7665
  64.   51 0041 C7442417                 movl        $543517984, 23(%esp)
  65.   51      206D6520
  66.   52 0049 66C74424                 movw        $63, 27(%esp)
  67.   52      1B3F00
  68.    9:main.c        ****
  69.   10:main.c        ****         strcat(str1, " ");
  70.   53                              .loc 1 11 0
  71.   54 0050 B8000000                 movl        $.LC2, %eax
  72.   54      00
  73.   55 0055 89442404                 movl        %eax, 4(%esp)
  74.   56 0059 8D442429                 leal        41(%esp), %eax
  75.   57 005d 890424                   movl        %eax, (%esp)
  76.   58 0060 E8FCFFFF                 call        strcat
  77.   58      FF
  78.   11:main.c        ****         strcat(str1, str2);
  79.   59                              .loc 1 12 0
  80.   60 0065 8D442425                 leal        37(%esp), %eax
  81.   61 0069 89442404                 movl        %eax, 4(%esp)
  82.   62 006d 8D442429                 leal        41(%esp), %eax
  83.   63 0071 890424                   movl        %eax, (%esp)
  84.   64 0074 E8FCFFFF                 call        strcat
  85.   64      FF
  86.   12:main.c        ****         printf("str1: %s\n", str1);
  87.   65                              .loc 1 13 0
  88.   66 0079 B8020000                 movl        $.LC3, %eax
  89.   66      00
  90.   67 007e 8D542429                 leal        41(%esp), %edx
  91.   68 0082 89542404                 movl        %edx, 4(%esp)
  92.   69 0086 890424                   movl        %eax, (%esp)
  93.   70 0089 E8FCFFFF                 call        printf
  94.   70      FF
  95.   13:main.c        ****
  96.   14:main.c        ****         strncat(str3, str4, 16);
  97.   71                              .loc 1 15 0
  98.   72 008e 8D442413                 leal        19(%esp), %eax
  99.   73 0092 C7442408                 movl        $16, 8(%esp)
  100.   73      10000000
  101.   74 009a 89442404                 movl        %eax, 4(%esp)
  102.   75 009e 8D44241D                 leal        29(%esp), %eax
  103.   76 00a2 890424                   movl        %eax, (%esp)
  104.   77 00a5 E8FCFFFF                 call        strncat
  105.   77      FF
  106.   15:main.c        ****         printf("str1: %s\n", str1);
  107.   78                              .loc 1 16 0
  108.   79 00aa B8020000                 movl        $.LC3, %eax
  109.   79      00
  110.   80 00af 8D542429                 leal        41(%esp), %edx
  111.   81 00b3 89542404                 movl        %edx, 4(%esp)
  112.   82 00b7 890424                   movl        %eax, (%esp)
  113.   83 00ba E8FCFFFF                 call        printf
  114.   83      FF
  115.   16:main.c        ****         printf("str3: %s\n", str3);
  116.   84                              .loc 1 17 0
  117.   85 00bf B80C0000                 movl        $.LC4, %eax
  118.   85      00
  119.   86 00c4 8D54241D                 leal        29(%esp), %edx
  120.   87 00c8 89542404                 movl        %edx, 4(%esp)
  121.   88 00cc 890424                   movl        %eax, (%esp)
  122.   89 00cf E8FCFFFF                 call        printf
  123.   89      FF
  124.   17:main.c        ****
  125.   18:main.c        ****         return 0;
  126.   90                              .loc 1 19 0
  127.   91 00d4 B8000000                 movl        $0, %eax
  128.   91      00
  129.   19:main.c        **** }
  130.   92                              .loc 1 20 0
  131.   93 00d9 C9                       leave
  132.   94                              .cfi_restore 5
  133.   95                              .cfi_def_cfa 4, 4
  134.   96 00da C3                       ret
  135.   97                              .cfi_endproc
  136.   98                      .LFE0:
  137. 100                      .Letext0:
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-10 14:41:02 | 显示全部楼层    本楼为最佳答案   
我理解了,画了一张图,不知道你能不能理解
无标题.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

str1为什么会显示str3后面的内容呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

无标题.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

非常感谢!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-9 11:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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