![](/img/trans.png)
[英]Using fscanf to read a string and then a variable number of integers to EOF
[英]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
如果您希望bword
和word
彼此獨立,則將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.