繁体   English   中英

fscanf更改字符串变量?

[英]fscanf changes string variable?

我是编程的初学者,目前正在学习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 bword修改word ,因为bword只是对实际数据位置即数组word的引用1

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

char bword[SOME_REASONABLE_SIZE];

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

请注意,当您将数组传递给fscanf() ,实际上是将指针传递给了它的第一个元素,恰好是您的bword的第一位。


1 一般意义上的引用,而不是c ++意义上的引用。

首先,您必须了解指针(您可以参阅tutorialspoint )。
然后您发现数组是指向内存的指针,因此在分配它们时,您只分配了地址,因此,如果其中一个更改,另一个也会更改。 如果要复制不能分配的字符串,则必须复制它们,然后可以使用strcpy()函数。 如手册页所述,它具有以下语法:

char *strcpy(char *dest, const char *src);

strcpy()函数将src指向的字符串(包括终止的空字节('\\ 0'))复制到dest指向的缓冲区。 字符串不能重叠,并且目标字符串dest必须足够大才能接收副本。 当心缓冲区溢出!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM