我正在读一本书“黑客:剥削的艺术”。我现在只在开始的章节中,它将介绍一些C语言中的基本字符串复制和输入函数。
最近的示例使用strcpy和scanf的组合来重复打印字符串,但是在编译时,会为我生成格式错误的输出。示例如下:
输入c:

#include <stdio.h>
#include <string.h>
int main() {
    char message[10];
    int count, i;

    strcpy(message, "Hello, world!");

    printf("Repeat how many times? ");
    scanf("%d", &count);

    for(i=0; i < count; i++)
        printf("%3d - %s\n", i, message);
}

根据这本书,当你输入一个数字时,它应该打印那么多次。
例如:
reader@hacking:~/booksrc $ ./input
Repeat how many times? 3
0 - Hello, world!
1 - Hello, world!
2 - Hello, world!

这对我很有用,但不知怎的,“你好,世界!”字符串已损坏且格式不正确,将只打印“Hello,wor”,然后打印不正确的字符。
helpme@stackoverflow:~/booksrc $ ./input
Repeat how many times? 3
0 - Hello, wor
1 - Hello, wor␦
2 - Hello, wor␦

最后打印的不正确字符似乎有一些一致性,好像它在遍历UTF-8字符或类似的字符。对于前三个,它将打印表示不可打印Unicode字符的框,如果给定更大的范围,则最终将开始打印实际字符。
我认为这与scanf的使用有关,也许还与我的终端有关(我在Debian GNU/Linux机器上运行这个程序,使用默认的GNOME终端),但是我很好奇这个例子是如何在gcc的早期版本而不是当前版本上工作的-scanf在C的当前版本上有不同的解释吗?
至于其他信息,我运行的是gcc版本6.3.0。
如果有人能提供帮助,将不胜感激。谢谢!

最佳答案

char message[10];
...
strcpy(message, "Hello, world!");

message不能包含整个Hello, world!,因为它太小了。因此,您会遇到未定义的行为,这就解释了您看到的奇怪输出。您需要增加message的大小或动态确定其所需大小,例如使用strlen

关于c - scanf的输出格式不正确(黑客:剥削的范例艺术),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44264758/

10-12 04:49