我有一些代碼的問題C:奇怪的行爲scanf函數,字符串和C
char opt, name[10], path[25];
printf("Things\nMore things\n");
printf("Even more things\n");
printf("\nChar: ");
scanf("\n%c",&opt);
printf("\nTask name: ");
scanf("%s",name);
printf("Name: %s\n", name);
printf("\nFolder name: ");
scanf("%s",path);
printf("Name: %s\n", name);
printf("Path: %s\n", path);
這是在做一個「乾淨」的模式故障代碼。問題在於,當數據的大小大於10或25時,則不是切割字符串,而是混合「名稱」和「路徑」。在某些情況下甚至會將「路徑」的一部分放入「名稱」中。這是不確定的行爲,還是我失去了一些東西?
是的,寫過一個數組的末尾是*未定義的行爲*,如你所懷疑的。當數組已滿時,scanf沒有自動的「停止讀取」。它不知道數組的大小時怎麼可能?可以將格式更改爲例如'%10s'來解決這個問題,但規則是icky。閱讀您友好的scanf手冊頁! – Jens
PS:換行符應該在printf字符串的* end *處,而不是在開頭;否則stdout流可能不會被刷新,您將等待提示。 (或添加fflush(stdout))。 – Jens
這與使用(*)scanf系列中的函數時有關溢出的其他問題非常相似,例如http://stackoverflow.com/q/16593175/1281433。 –