鱼C论坛

 找回密码
 立即注册
查看: 2355|回复: 8

[已解决]关于C语言中string函数的使用问题

[复制链接]
发表于 2022-7-17 23:13:41 | 显示全部楼层 |阅读模式

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

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

x
代码如下:
  1. #include<stdio.h>
  2. #include<string.h>

  3. int main()
  4. {
  5.         char F1[]="########";
  6.         char F2[]="##      ";
  7.        
  8.         char I1[]=("####");
  9.         char I2[]=(" ## ");
  10.        
  11.         char S1[]=(" ######  ");
  12.         char S2[]=("##    ## ");
  13.        
  14.         char H1[]=("##    ##");
  15.         char H2[]=("##    ##");
  16.        
  17.         char C1[]=(" ###### ");
  18.         char C2[]=("##    ##");
  19.        
  20.        
  21.         int a,i;
  22.        
  23.         printf("请输入字母的间隔(空格数):");
  24.         scanf("%d",&a);
  25.        
  26.         char kg[]=" ";
  27.        
  28.         for(i=0;i<a;i++)
  29.         {
  30.                 strcat(kg," ");
  31.         }
  32.        
  33.         strcat(F1,kg);
  34.         strcat(F1,I1);
  35.         strcat(F1,kg);
  36.         strcat(F1,S1);
  37.         strcat(F1,kg);
  38.         strcat(F1,H1);
  39.         strcat(F1,kg);
  40.         strcat(F1,C1);
  41.        
  42.         strcat(F2,kg);
  43.         strcat(F2,I2);
  44.         strcat(F2,kg);
  45.         strcat(F2,S2);
  46.         strcat(F2,kg);
  47.         strcat(F2,H2);
  48.         strcat(F2,kg);
  49.         strcat(F2,C2);
  50.        
  51.         printf("%s\n",F1);//第一次只打印这一行,把F2那行注释
  52.         printf("%s",F2);//第二次只打印这一行,把F1那行注释
  53.                                 //第三次把两行都打印出来
  54.        
  55.         return 0;
  56. }
复制代码


第一次打印的结果:
@HX(HM36$BG12BSA4AQ{1(1.png ,是正确的
第二次打印的结果:
8WFG7T70I]SECZN633{ZI.png ,也是正确的
第三次打印的结果:
Q}XTBIOQV}S{MY95AAE5251.png ,第一行(也即打印的F1)结果错误,第二行(也即打印的F2)结果正确

求问为什么会这样???
最佳答案
2022-7-18 13:33:14
治愈罗小黑 发表于 2022-7-18 11:16
但是你看第一次打印结果,是没问题的啊

没有内存空间怎么cat ?
  1. #include <stdio.h>
  2. #include <string.h>

  3. int main() {
  4.     char F1[1024] = "########";
  5.     char F2[1024] = "##      ";

  6.     char I1[] = ("####");
  7.     char I2[] = (" ## ");

  8.     char S1[] = (" ######  ");
  9.     char S2[] = ("##    ## ");

  10.     char H1[] = ("##    ##");
  11.     char H2[] = ("##    ##");

  12.     char C1[] = (" ###### ");
  13.     char C2[] = ("##    ##");

  14.     int a, i;

  15.     printf("请输入字母的间隔(空格数):");
  16.     scanf("%d", &a);

  17.     char kg[1024] = " ";

  18.     for (i = 0; i < a; i++) {
  19.         strcat(kg, " ");
  20.     }

  21.     strcat(F1, kg);
  22.     strcat(F1, I1);
  23.     strcat(F1, kg);
  24.     strcat(F1, S1);
  25.     strcat(F1, kg);
  26.     strcat(F1, H1);
  27.     strcat(F1, kg);
  28.     strcat(F1, C1);

  29.     strcat(F2, kg);
  30.     strcat(F2, I2);
  31.     strcat(F2, kg);
  32.     strcat(F2, S2);
  33.     strcat(F2, kg);
  34.     strcat(F2, H2);
  35.     strcat(F2, kg);
  36.     strcat(F2, C2);

  37.     printf("%s\n", F1); //第一次只打印这一行,把F2那行注释
  38.     printf("%s", F2);   //第二次只打印这一行,把F1那行注释
  39.                         //第三次把两行都打印出来

  40.     puts("");
  41.     return 0;
  42. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-7-18 07:27:10 From FishC Mobile | 显示全部楼层

回帖奖励 +10 鱼币

溢出了吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-7-18 10:23:35 | 显示全部楼层

具体是啥溢出了啊?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-7-18 10:33:23 From FishC Mobile | 显示全部楼层
治愈罗小黑 发表于 2022-7-18 10:23
具体是啥溢出了啊?

char F1[]="########";
这里F1的空间已经确定了,那么后面你再用strcat
往里面增加数据,就会溢出,会产生一些未知的结果
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-7-18 11:16:18 | 显示全部楼层
wp231957 发表于 2022-7-18 10:33
char F1[]="########";
这里F1的空间已经确定了,那么后面你再用strcat
往里面增加数据,就会溢出,会 ...

但是你看第一次打印结果,是没问题的啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-7-18 13:33:14 | 显示全部楼层    本楼为最佳答案   
治愈罗小黑 发表于 2022-7-18 11:16
但是你看第一次打印结果,是没问题的啊

没有内存空间怎么cat ?
  1. #include <stdio.h>
  2. #include <string.h>

  3. int main() {
  4.     char F1[1024] = "########";
  5.     char F2[1024] = "##      ";

  6.     char I1[] = ("####");
  7.     char I2[] = (" ## ");

  8.     char S1[] = (" ######  ");
  9.     char S2[] = ("##    ## ");

  10.     char H1[] = ("##    ##");
  11.     char H2[] = ("##    ##");

  12.     char C1[] = (" ###### ");
  13.     char C2[] = ("##    ##");

  14.     int a, i;

  15.     printf("请输入字母的间隔(空格数):");
  16.     scanf("%d", &a);

  17.     char kg[1024] = " ";

  18.     for (i = 0; i < a; i++) {
  19.         strcat(kg, " ");
  20.     }

  21.     strcat(F1, kg);
  22.     strcat(F1, I1);
  23.     strcat(F1, kg);
  24.     strcat(F1, S1);
  25.     strcat(F1, kg);
  26.     strcat(F1, H1);
  27.     strcat(F1, kg);
  28.     strcat(F1, C1);

  29.     strcat(F2, kg);
  30.     strcat(F2, I2);
  31.     strcat(F2, kg);
  32.     strcat(F2, S2);
  33.     strcat(F2, kg);
  34.     strcat(F2, H2);
  35.     strcat(F2, kg);
  36.     strcat(F2, C2);

  37.     printf("%s\n", F1); //第一次只打印这一行,把F2那行注释
  38.     printf("%s", F2);   //第二次只打印这一行,把F1那行注释
  39.                         //第三次把两行都打印出来

  40.     puts("");
  41.     return 0;
  42. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-7-18 13:37:10 | 显示全部楼层
治愈罗小黑 发表于 2022-7-18 11:16
但是你看第一次打印结果,是没问题的啊

这可是C语言
输出结果正确就意味着程序一定正确?
这是我这边的输出
我这边是直接输出报错信息
具体报错信息自己看吧
  1. $ cat main.c
  2. #include <stdio.h>
  3. #include <string.h>

  4. int main() {
  5.     char F1[] = "########";
  6.     char F2[] = "##      ";

  7.     char I1[] = ("####");
  8.     char I2[] = (" ## ");

  9.     char S1[] = (" ######  ");
  10.     char S2[] = ("##    ## ");

  11.     char H1[] = ("##    ##");
  12.     char H2[] = ("##    ##");

  13.     char C1[] = (" ###### ");
  14.     char C2[] = ("##    ##");

  15.     int a, i;

  16.     printf("请输入字母的间隔(空格数):");
  17.     scanf("%d", &a);

  18.     char kg[] = " ";

  19.     for (i = 0; i < a; i++) {
  20.         strcat(kg, " ");
  21.     }

  22.     strcat(F1, kg);
  23.     strcat(F1, I1);
  24.     strcat(F1, kg);
  25.     strcat(F1, S1);
  26.     strcat(F1, kg);
  27.     strcat(F1, H1);
  28.     strcat(F1, kg);
  29.     strcat(F1, C1);

  30.     strcat(F2, kg);
  31.     strcat(F2, I2);
  32.     strcat(F2, kg);
  33.     strcat(F2, S2);
  34.     strcat(F2, kg);
  35.     strcat(F2, H2);
  36.     strcat(F2, kg);
  37.     strcat(F2, C2);

  38.     printf("%s\n", F1); //第一次只打印这一行,把F2那行注释
  39.     printf("%s", F2);   //第二次只打印这一行,把F1那行注释
  40.                         //第三次把两行都打印出来

  41.     puts("");
  42.     return 0;
  43. }
  44. $ gcc-debug -o main main.c
  45. $ ./main
  46. 请输入字母的间隔(空格数):2
  47. =================================================================
  48. ==168734==ERROR: AddressSanitizer: stack-buffer-overflow on address 0x7ffd7c63cf52 at pc 0x7f678425f427 bp 0x7ffd7c63cf00 sp 0x7ffd7c63c6a8
  49. WRITE of size 2 at 0x7ffd7c63cf52 thread T0
  50.     #0 0x7f678425f426 in __interceptor_memcpy /usr/src/debug/gcc/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc:827
  51.     #1 0x55c70fb62924 in main /tmp/main.c:28
  52.     #2 0x7f678362928f  (/usr/lib/libc.so.6+0x2928f)
  53.     #3 0x7f6783629349 in __libc_start_main (/usr/lib/libc.so.6+0x29349)
  54.     #4 0x55c70fb62174 in _start (/tmp/main+0x1174)

  55. Address 0x7ffd7c63cf52 is located in stack of thread T0 at offset 50 in frame
  56.     #0 0x55c70fb62258 in main /tmp/main.c:4

  57.   This frame has 12 object(s):
  58.     [32, 36) 'a' (line 20)
  59.     [48, 50) 'kg' (line 25) <== Memory access at offset 50 overflows this variable
  60.     [64, 69) 'I1' (line 8)
  61.     [96, 101) 'I2' (line 9)
  62.     [128, 137) 'F1' (line 5)
  63.     [160, 169) 'F2' (line 6)
  64.     [192, 201) 'H1' (line 14)
  65.     [224, 233) 'H2' (line 15)
  66.     [256, 265) 'C1' (line 17)
  67.     [288, 297) 'C2' (line 18)
  68.     [320, 330) 'S1' (line 11)
  69.     [352, 362) 'S2' (line 12)
  70. HINT: this may be a false positive if your program uses some custom stack unwind mechanism, swapcontext or vfork
  71.       (longjmp and C++ exceptions *are* supported)
  72. SUMMARY: AddressSanitizer: stack-buffer-overflow /usr/src/debug/gcc/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc:827 in __interceptor_memcpy
  73. Shadow bytes around the buggy address:
  74.   0x10002f8bf990: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  75.   0x10002f8bf9a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  76.   0x10002f8bf9b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  77.   0x10002f8bf9c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  78.   0x10002f8bf9d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  79. =>0x10002f8bf9e0: 00 00 00 00 f1 f1 f1 f1 04 f2[02]f2 05 f2 f2 f2
  80.   0x10002f8bf9f0: 05 f2 f2 f2 00 01 f2 f2 00 01 f2 f2 00 01 f2 f2
  81.   0x10002f8bfa00: 00 01 f2 f2 00 01 f2 f2 00 01 f2 f2 00 02 f2 f2
  82.   0x10002f8bfa10: 00 02 f3 f3 00 00 00 00 00 00 00 00 00 00 00 00
  83.   0x10002f8bfa20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  84.   0x10002f8bfa30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  85. Shadow byte legend (one shadow byte represents 8 application bytes):
  86.   Addressable:           00
  87.   Partially addressable: 01 02 03 04 05 06 07
  88.   Heap left redzone:       fa
  89.   Freed heap region:       fd
  90.   Stack left redzone:      f1
  91.   Stack mid redzone:       f2
  92.   Stack right redzone:     f3
  93.   Stack after return:      f5
  94.   Stack use after scope:   f8
  95.   Global redzone:          f9
  96.   Global init order:       f6
  97.   Poisoned by user:        f7
  98.   Container overflow:      fc
  99.   Array cookie:            ac
  100.   Intra object redzone:    bb
  101.   ASan internal:           fe
  102.   Left alloca redzone:     ca
  103.   Right alloca redzone:    cb
  104. ==168734==ABORTING
  105. $
复制代码

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

使用道具 举报

 楼主| 发表于 2022-7-18 15:55:40 | 显示全部楼层
人造人 发表于 2022-7-18 13:33
没有内存空间怎么cat ?

明白了,谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-7-18 15:59:20 | 显示全部楼层
wp231957 发表于 2022-7-18 10:33
char F1[]="########";
这里F1的空间已经确定了,那么后面你再用strcat
往里面增加数据,就会溢出,会 ...

我明白了,谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-16 23:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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