C 中的 strcpy 和 sprintf
strcpy and sprintf in C
我正在尝试像这样设置一些字符串变量:
char thingA[7], thingB[7], thingC[7];
strcpy(thingA, "StringA");
strcpy(thingB, "StringB");
strcpy(thingC, "StringC");
printf("%s\n", thingA);
printf("%s\n", thingB);
printf("%s\n", thingC);
但不是这样输出:
StringA
StringB
StringC
它的输出是这样的:
StringA StringB StringC
StringB StringC
StringC
我用 sprintf
试过这个,但得到了相同的结果。
老实说,我不知道发生了什么,也不知道如何解决这个问题,而且我在网上找不到任何东西,因为由于某种原因,搜索这类东西很难。
那么基本上为什么它在 a 中存储字符串 b 和 c,在 b 中存储 c?
常见错误:您的声明短了一个字节。如果你数一下你的常量字符串中的字符,有7个,你需要space来终止'[=10=]'
,否则你会覆盖内存并得到未定义的bahvaior。
所以将它们声明为 [8]
,它将起作用。
代码的问题是您在 C 中的字符串以 null 结尾 ([=10=]
),因此 StringA
,尽管有 7 个可打印字符,但实际上需要 8 个字符来存储。这三个 char 数组在堆栈上背靠背,因此覆盖终止空字符将导致它们被连接起来。每个指向 char 数组的指针都从不同的偏移量开始,因此 thingB
和 thingC
的较短字符串,但在所有情况下 printf
都会读取字符串,直到它在事情结束C.
请注意,这是一个典型的缓冲区溢出错误,您很幸运,在 thingC 之后的堆栈上有一个空值,否则 printf 将继续读取和打印内存的时间更长。
我正在尝试像这样设置一些字符串变量:
char thingA[7], thingB[7], thingC[7];
strcpy(thingA, "StringA");
strcpy(thingB, "StringB");
strcpy(thingC, "StringC");
printf("%s\n", thingA);
printf("%s\n", thingB);
printf("%s\n", thingC);
但不是这样输出:
StringA
StringB
StringC
它的输出是这样的:
StringA StringB StringC
StringB StringC
StringC
我用 sprintf
试过这个,但得到了相同的结果。
老实说,我不知道发生了什么,也不知道如何解决这个问题,而且我在网上找不到任何东西,因为由于某种原因,搜索这类东西很难。
那么基本上为什么它在 a 中存储字符串 b 和 c,在 b 中存储 c?
常见错误:您的声明短了一个字节。如果你数一下你的常量字符串中的字符,有7个,你需要space来终止'[=10=]'
,否则你会覆盖内存并得到未定义的bahvaior。
所以将它们声明为 [8]
,它将起作用。
代码的问题是您在 C 中的字符串以 null 结尾 ([=10=]
),因此 StringA
,尽管有 7 个可打印字符,但实际上需要 8 个字符来存储。这三个 char 数组在堆栈上背靠背,因此覆盖终止空字符将导致它们被连接起来。每个指向 char 数组的指针都从不同的偏移量开始,因此 thingB
和 thingC
的较短字符串,但在所有情况下 printf
都会读取字符串,直到它在事情结束C.
请注意,这是一个典型的缓冲区溢出错误,您很幸运,在 thingC 之后的堆栈上有一个空值,否则 printf 将继续读取和打印内存的时间更长。