我是编程的初学者,我目前正在学习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改变。
答案 0 :(得分:1)
你需要明白这个
char *bword = word;
声明指向数组word
的第一个元素的指针,这意味着修改bword
也会修改word
,因为bword
只是一个引用 1 到真实数据位置,即数组word
如果您希望bword
和word
彼此独立,请将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必须足够大才能接收副本。小心缓冲区溢出!