gpt4 book ai didi

C 声明顺序错误

转载 作者:行者123 更新时间:2023-11-30 17:52:22 25 4
gpt4 key购买 nike

无论我首先声明哪个 char[],sscanf 函数都不会读取它。

char rd[4];
char rs[4];
char rt[4];
sscanf(line, "or $%[^,], $%[^,], $%s", rd, rs, rt);
printf("RD: %s, RS: %s, RT: %s\n", rd, rs, rt);

比如我把rd放在前面,rd没有读入。我把 rs 放在第一位,但它没有被读入。

这是我正在读取的字符串:“或$a0,$t4,$零”

谁能解释一下吗?

最佳答案

这几乎可以肯定是因为您的字符数组不够大,无法容纳您正在读取的所有数据。具体来说,字符串 "zero" (及其 \0 终止符)需要五个字节,而不是四个。超出数组末尾的写入是未定义的行为,一旦这样做,所有行为保证都会消失。

例如,当您声明:

char rd[4];
char rs[4];
char rt[4];

可能像这样布置内存:

 rt: [1] [2] [3] rs: [1] [2] [3] rd: [1] [2] [3]
+---+---+---+---+---+---+---+---+---+---+---+---+
| | | | | | | | | | | | |
+---+---+---+---+---+---+---+---+---+---+---+---+

并执行命令:

sscanf ("or $a0, $t4, $zero", "or $%[^,], $%[^,], $%s", rd, rs, rt);

可能导致内存块按所示顺序填充,从而导致以下内存写入,其中 . 表示 \0 :

 rt: [1] [2] [3] rd: [1] [2] [3] rs: [1] [2] [3]
+---+---+---+---+---+---+---+---+---+---+---+---+
| | | | | a | 0 | . | | | | | |
+---+---+---+---+---+---+---+---+---+---+---+---+
+---+---+---+---+---+---+---+---+---+---+---+---+
| | | | | | | | | t | 4 | . | |
+---+---+---+---+---+---+---+---+---+---+---+---+
+---+---+---+---+---+---+---+---+---+---+---+---+
| z | e | r | o | . | | | | | | | |
+---+---+---+---+---+---+---+---+---+---+---+---+

最终的结果是:

 rt: [1] [2] [3] rd: [1] [2] [3] rs: [1] [2] [3]
+---+---+---+---+---+---+---+---+---+---+---+---+
| z | e | r | o | . | 0 | . | | t | 4 | . | |
+---+---+---+---+---+---+---+---+---+---+---+---+

您可以看到,rdrt 覆盖,使得 rd 看起来像是没有读入任何内容。

现在请注意上面“可能”一词的使用,不能保证内存会以这种方式布局,这只是对结果发生原因的一种可能解释。

最重要的是,您不应在数组中读取超出允许范围的数据。

至于如何解决这个问题,C 语言中有许多可靠的获取输入的方法,例如 this one .

关于C 声明顺序错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16246116/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com