2013-12-12 290 views
0

我能解決這個問題,感謝所有幫助我解決問題的人。用另一個字符串替換字符串中的值

+3

你說的問題是,當你有要使用的代碼時,代碼不會編譯。難道你不認爲提供不編譯的代碼以及編譯嘗試時提供的錯誤輸出是一個超級想法嗎? – mah

+0

對不起,我添加了其他部分。這是我第一次使用這個網站。 – user3096716

+0

當你嘗試編譯時,你得到的錯誤是什麼?當涉及到複製字符串時,你會遇到一個問題,「word [i] = dictn [j]'只會分配指針,而不是複製單詞中的實際字符。 – Macattack

回答

1

您可以使用

sprintf(word, "%s ", dictn); 

如果您的代碼正在與printf的應該與sprintf的工作,只要你不溢出「詞」,包括NULL終止,所以您可能必須調整「字「如果它小於dictn。

+0

謝謝,我會盡力的!但是,你能解釋一下sprintf做什麼?它是否與fprintf相同? – user3096716

+0

sprintf的工作方式與printf類似,但是它會打印到字符串而不是標準輸出(在本例中打印到名爲「word」的字符串)。很高興看到「單詞」和「單詞」的聲明。處理您遇到的問題最安全的方法是逐字閱讀空格,製表符或換行符,因爲您從文件中讀取的方式有可能會溢出「word」或「dictn」,如果用戶爲您的程序提供一個文本文件,其中包含一個非常長的不間斷字符序列,您的程序會崩潰或產生一些隨機行爲 –

0

首先,我假設你已經創建了具有足夠大小的數組worddictn以保存任何文件的最大長度字符串。

第一次故障:

在您創建循環,i代表在輸入文件中的字符串的數量和j表示辭典弦數。 word是您的輸入字符串變量,dictn是您的字典字符串變量。但是你想要檢索和修改單詞的第i個或第d個單詞的第j個字符。這可能會導致錯誤,因爲可能會出現這樣的情況:

假設有inp文件有10個單詞,dictn有100個單詞。並且在您的循環中,i的值爲8,而j的值爲88.對應這些ij的值,字符的字符串值爲appledictn的字符串值也爲apple。所以這意味着apple是輸入文件的第8個單詞和詞典文件的第88個單詞。如果滿足其中一個條件,編譯器會嘗試應用word[i]=dictn[j];之類的語句。這個例子意味着word[8] = dictn[88];。但是這兩個字符串都有apple作爲只包含5個字符的值!這會導致錯誤,因爲您試圖檢索長度爲5的字符串的第88個字符並將其分配給5長度字符串的第8個字符。所以你的代碼是錯誤的,它只適用於一些罕見的情況。

第二次故障:

我假設你想讀整部字典文件中輸入文件的每一個字,但你將能夠讀取它的輸入文件,因爲你不打開它的唯一的第一個字或在讀完整本字典後,在字典文件的開頭設置位置指示符。

三錯:

你的第一個if語句將永遠不會達到假設你已經創建len1len2變量爲整數。因爲在你的if語句,有小數數目的乘積的整數,將返回0,結果,自fscanf()忽略空格,len1len2將至少爲1

第四故障:

同樣你的else if語句永遠不會被達到,因爲如果一個字符串與另一個字符串具有相同的值,那麼它們的第一個字符也將相等,並且你的if語句在你比較它們的第一個字符時也將被接受。


事實上,我會寫代碼解決方案,但首先你需要正確的事情了其在邏輯上是錯誤的,因爲我不知道你真正嘗試通過代碼來實現 - 只是因爲我評論充滿假設 - 。但我可以爲您提供一些指導原則:

  1. 將您len1len2變量從intfloat和投值,其返回從strlen()功能float
  2. 重新打開您的dict文件進行外部循環的每次迭代。 (並且不要忘記不要關閉它)。
  3. 要改變你的inp文件,你可以使用一個fpos_t類型的變量來跟蹤你inp文件的位置指示器(fgetpos()獲得當前位置和fsetpos()改變位置fpos_t變量的值,你可以搜索他們。)和鍵入單詞fprintf()fputs()到該位置以更改該字符串。
相關問題