LordHdy 发表于 2018-5-5 22:36:01

strcat和strncat的顺序的影响

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

输出结果如下图:

lovefishc.com 发表于 2018-5-6 22:22:38

倒数第三行去掉试试

LordHdy 发表于 2018-5-7 11:52:36

lovefishc.com 发表于 2018-5-6 22:22
倒数第三行去掉试试

我有一个打印错误第二个printf 括号内应该是 ("str1: %s\n",str1);
我想知道为什么strncat对str1没有进行操作, 但是前后两次输出str1为什么会不一样?

Dr丶温 发表于 2018-5-7 12:04:39

是不是内存中线性存储的问题,俺也理解的也不是很清楚

lovefishc.com 发表于 2018-5-7 16:26:57

倒数第三行把16改成9,,,越界了

LordHdy 发表于 2018-5-8 22:50:43

lovefishc.com 发表于 2018-5-7 16:26
倒数第三行把16改成9,,,越界了

http://bbs.fishc.com/home.php?mod=space&uid=438949&do=album&picid=9729&goto=down#pic_block
http://bbs.fishc.com/home.php?mod=space&uid=438949&do=album&picid=9730&goto=up#pic_block
str1的结果还是这样{:5_96:}

lovefishc.com 发表于 2018-5-10 11:58:23

为什呀?

人造人 发表于 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:

人造人 发表于 2018-5-10 14:41:02

我理解了,画了一张图,不知道你能不能理解

LordHdy 发表于 2018-5-10 22:40:16

人造人 发表于 2018-5-10 14:41
我理解了,画了一张图,不知道你能不能理解

str1为什么会显示str3后面的内容呢?

人造人 发表于 2018-5-10 23:03:05

LordHdy 发表于 2018-5-10 22:40
str1为什么会显示str3后面的内容呢?

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

LordHdy 发表于 2018-5-11 10:11:16

人造人 发表于 2018-5-10 23:03
在执行 strcat(str1, " "); 之前,内存中是这样的,能理解吗
str4 排在 str3 的前面,str3 排在 str2 的 ...

非常感谢!
页: [1]
查看完整版本: strcat和strncat的顺序的影响