簡體   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