-5
A
回答
0
根本這裏的問題是,循環退出條件不能得到滿足,這導致一個無限循環:
(i != j || i != j - 1)
這種情況是邏輯上等同於:
!(i == j && i == j - 1)
這顯然總是正確的,所以循環無限期地繼續。循環只需要繼續,只要j > i
。
這裏還有一個問題;即dangerous function gets()
should never be used.此函數在C99中已棄用,並且已從C11中的語言中完全刪除。一種替代方法是使用fgets()
。請注意,此函數保留換行符(如果緩衝區中有空間),所以您需要在獲取輸入後將其刪除。而且,如果緩衝區太小,字符可能會留在輸入流中。出於這個原因,最好宣佈一個慷慨大小的輸入緩衝區以降低此處出現問題的風險。沒有理由不使用一個包含1000個字符的輸入緩衝區,而我通常只用4096來表示這樣的事情。內存很便宜。
此外,在發佈的代碼中存在未定義行爲的風險,因爲輸入字符串可能爲空。在這種情況下,strlen(str)
將爲0,因此在循環主體j
的第一次執行中將遞減爲-1。但數組訪問str[-1]
超出範圍,並導致未定義的行爲。
此問題可以通過檢查j
在第一次遞減前爲正值來解決。請注意0是數組索引的正確類型,因爲它是一個unsigned
整數類型,保證能夠保存任何數組索引。另請注意,strlen()
函數返回的值爲size_t
,而不是int
。
以下是發佈代碼的修改版本。 size_t
類型用於數組索引。輸入字符串的長度存儲在j
中,然後只有當它是正值時纔會遞減;這將j
設置爲空終止符前面的字符的索引,只要輸入字符串不是空字符串即可。循環繼續,而j
大於i
,並且由這些值索引的字符相匹配。循環結束後,str[i]
和str[j]
應該同意;如果他們不這樣做,那麼投入就不是迴文。
#include <stdio.h>
#include <string.h>
#define BUF_SZ 4096
int main(void)
{
char str[BUF_SZ];
printf("Enter string:\n");
fgets(str, sizeof str, stdin); // Never use gets()
str[strcspn(str, "\r\n")] = '\0'; // remove '\n'
size_t i = 0;
size_t j = strlen(str);
if (j > 0) {
--j;
}
while (i < j && str[i] == str[j]) {
++i;
--j;
}
if (str[i] == str[j]) {
puts("string is palindrome!!");
} else {
puts("string is not palindrome!!");
}
return 0;
}
相關問題
- 1. C++ .exe停止工作
- 2. .exe文件停止工作,當我運行一個C++程序(沒有「/ 0」)
- 3. C++遊戲exe文件停止工作,很多課。在Visual C++
- 4. [OpenGL | C#] vhost32.exe在glTexImage2D停止工作
- 5. eventlistener函數並沒有停止工作
- 6. 防止exe文件停止
- 7. 編譯後批處理文件exe文件停止工作
- 8. C++ .exe已停止工作 - 代碼中出現錯誤
- 9. 如何解決此錯誤:.exe文件已停止工作
- 10. 「.exe文件已停止工作」運行時
- 11. .exe已停止工作代碼塊cpp
- 12. 11.exe已停止工作(代碼塊)
- 13. Code :: Blocks錯誤.exe已停止工作
- 14. [文件名.exe]已停止在C編程IDE工作就是Eclipse
- 15. C#單控制檯應用程序停止輸出,如果沒有鍵輸入
- 16. C#應用程序停止工作
- 17. Monodevelop - Ubuntu - exe文件作爲輸出?
- 18. 編譯時出現Visual Studio錯誤 - 「Microsoft.VsHub.Server.HttpeHostx64.exe已停止工作」
- 19. EXE在編譯後停止工作。 (Mysql C++連接器)
- 20. SWIFT - table.reloadData()沒有/停止工作
- 21. Python OpenCV:inRange()停止工作,沒有變化
- 22. SharePoint工作流並啓動EXE文件
- 23. 在Python腳本中殺死沒有響應的exe文件
- 24. program.exe(C)已停止工作
- 25. C++「Program.exe已停止工作」
- 26. 停止輸出源文件名cl.exe
- 27. SQL Server 2014 Express突然停止工作,並且沒有起牀
- 28. C#停止TCP文件傳輸
- 29. 程序沒有輸出到文件? C++
- 30. 應用停止工作
[不要將代碼和文本輸出爲圖像](https://meta.stackoverflow.com/q/303812/995714)。在這裏複製並粘貼它們 –
如果'strlen(str)'爲0,那麼未定義的行爲....另外,[在任何情況下都不要使用'gets()'](https://stackoverflow.com/questions/1694036/why-是最被-IT-應該 - 不被使用的功能,如此危險,這一點)。這個危險的函數不再是C語言的一部分。 –