這是一個奇怪的具體問題,但我需要幫助,因為我很困惑。我正在嘗試使用指標來要求用戶輸入一個字串,輸出將列印相反的內容。到目前為止,我已經使用了一個反向函式并應用了指標。下面是代碼現在的樣子:
#include <iostream>
using namespace std;
void reverse(char name[])
{
char *p;
p = name;
while (*p != '\0')
{
p;
}
while (*p >= 0)
{
cout << *p;
--p;
}
}
int main()
{
char name[100];
cout << "Please enter a string: ";
cin.getline(name, sizeof(name));
cout << "The reverse of the string is: ";
reverse(name);
return 0;
}
當我運行該程式時,它可以作業,但存在一個問題。例如輸入的字串是Stack Overflow,這是結果:
Please enter a string: Stack Overflow
The reverse of the string is: wolfrevO kcatS ?? ? a
如您所見,這些符號顯示在最終輸出中。我試過定位它的來源,我認為這是因為指標的原因,因為當我為函式使用陣列時,它正確地列印了沒有符號的反轉字串。我在問是否有辦法在仍然使用指標的同時洗掉這些符號?我已經嘗試了多種使用指標制作函式的變體,但符號仍然在最后列印。
uj5u.com熱心網友回復:
發生這種垃圾是因為在字串的開頭沒有空終止字符,因此在向后移動時不會終止。我修改了您的代碼以將哨兵零字符保留在第 0 個位置,現在您的代碼可以正常作業而沒有錯誤。
條件while (*p >= 0)也應替換為while (*p).
在線試試吧!
#include <iostream>
using namespace std;
void reverse(char name[])
{
char *p;
p = name;
while (*p != '\0')
{
p;
}
--p;
while (*p)
{
cout << *p;
--p;
}
}
int main()
{
char name[100];
name[0] = 0;
cout << "Please enter a string: ";
cin.getline(name 1, sizeof(name) - 1);
cout << "The reverse of the string is: ";
reverse(name 1);
return 0;
}
輸入:
Please enter a string: Stack Overflow
輸出:
The reverse of the string is: wolfrevO kcatS
uj5u.com熱心網友回復:
當你使用
while (*p >= 0)
{
cout << *p;
--p;
}
您似乎假設陣列開頭之前的空間被負數占用;這不是一個安全的假設,并且回圈可以遍歷該點,列印該記憶體區域中碰巧出現的任何二進制垃圾。我說它可以,因為像這樣將指標解參考到未分配的空間是未定義的行為。它可以做任何事情;它可以終止回圈,使程式看起來正常作業,它可以列印出亂碼,它可以使您的計算機崩潰。
如果要在給定字串的開頭停止,請查找給定字串的開頭:
do
{
--p;
cout << *p;
}
while (p != name);
uj5u.com熱心網友回復:
您正在將 100 個字符讀入字串,這意味著也有可能讀取一些垃圾輸入緩沖區值。這就是符號的來源。由于您使用的是字符陣列,因此可能不是 getline 而是使用以下內容:
char c = getchar();
int i = 0;
while(c != '\n'){
name[i] = c;
c= getchar();
i ;
}
name[i ] = '\0'
這樣,您將只閱讀需要閱讀的內容,并且在字串末尾會有終止字符 '\0'。請記住,使用 getline 可能有一個更清潔的解決方案。無論哪種方式,問題在于您正在讀取更多的值然后您想要讀入 char 陣列,并且由于您直接訪問記憶體,您需要找出一種在所需字串后添加 '\0' 的方法,所以該方法知道何時停止 - 我猜 char 陣列是以這樣一種方式實作的,以確保這種情況總是發生,因此它適用于 char 陣列而不適用于指標。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/362735.html
