fscanf改变字符串变量?

时间:2015-03-07 16:25:55

标签: c variables while-loop scanf

我是编程的初学者,我目前正在学习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

那么我该如何解决这个问题呢?我不想让bword改变。

2 个答案:

答案 0 :(得分:1)

你需要明白这个

char *bword = word;

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

如果您希望bwordword彼此独立,请将bword设为数组,以便将其存储在其他位置,例如

char bword[SOME_REASONABLE_SIZE];

从这里你可以调用fscanf()并传递相应的数组,结果将是你之前预期的结果。

注意,当你将数组传递给fscanf()时,基本上你传递一个指向它的第一个元素的指针,就像你bword一样。


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

答案 1 :(得分:0)

首先,您必须了解指针(您可以看到tutorialspoint) 然后你发现数组是一个指向内存的指针,所以当你分配它们时你只需要分配地址,这样如果其中一个改变了,那么它也会被改变。如果要复制无法分配的字符串,则必须复制它们,然后才能使用strcpy()功能。因为man页面说它有以下语法:

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

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