我是编程的初学者,目前正在学习C,但是遇到了使我感到困惑的事情。

在我的while循环中,我有:

char* bword = word
fscanf(fp, "%s", word);


其中word是char [46],bword是char *,fp是文件(在这种情况下为单词字典)。我想在扫描fp之前先跟踪该单词,然后再进行替换。在我看来,在更改前将单词分配给变量似乎是合乎逻辑的。但是,如果我在fscanf(fp,'%s“,word)之后打印bword,那么它将被更改为新单词!我真的不明白为什么和如何。

如果我这样做:

bword = word;
printf("1.%s\n", word);
printf("2.%s\n", bword);
// scan the file for a for a word and store in word
fscanf(fp, "%s", word);
printf("3.%s\n", word);
printf("4.%s\n", bword);


我在命令行中得到以下结果:

1.
2.
3.a
4.a


(您不会在1和2之前看到任何内容,因为当时单词为空)。
我还尝试在循环之前将单词分配给“ bar”,但随后得到:

1.bar
2.bar
3.a
4.a


那么我该如何解决呢?我不想改变剑。

最佳答案

您需要了解

char *bword = word;


声明一个指向数组word的第一个元素的指针,这意味着修改bword也会修改word,因为bword只是对实际数据位置(数组word的引用)1

如果希望bwordword彼此独立,则将bword设置为数组,以便将其存储在不同的位置,如下所示

char bword[SOME_REASONABLE_SIZE];


从这里,您可以调用fscanf()并传递适当的数组,结果将是您之前期望的结果。

请注意,当您将数组传递给fscanf()时,实际上是在传递指向其第一个元素的指针,恰好是您的bword首先。



1A一般意义上的参考,而不是c ++意义上的参考。

09-28 00:52