2017-02-19 121 views
2

我正在爲我正在做的初學C++類做一些編碼。在課堂上,我們必須接受另一名學生提交的代碼並修復他們創建的錯誤。代碼如下:空終止符 1?

#include <iostream> 
using namespace std; 

int countChars(char *, char); // Function prototype 

int main() 
{ 
    const int SIZE = 51; // Array size 
    char userString[SIZE]; // To hold a string 
    char letter;   // The character to count 

    // Get a string from the user. 
    cout << "Enter a string (up to 50 characters): "; 
    cin.getline(userString, SIZE); 

    // Get a character to count occurrences of within the string. 
    cout << "Enter a character and I will tell you how many\n"; 
    cout << "times it appears in the string: "; 
    cin >> letter; 

    // Display the number of times the character appears. 
    cout << letter << " appears "; 
    cout << countChars(userString, letter) << " times.\n"; 
    return 0; 
} 

int countChars(char *strPtr, char ch) 
{ 
    int times = 0; // Number of times ch appears in the string 

    // Step through the string counting occurrences of ch. 
    while (*strPtr != '\0')// ***** There was a one placed inside the null operator, however, this is not a syntax error, but rather just incorrect. 
    { 
     if (*strPtr == ch) // If the current character equals ch... 
      times++;   // ... increment the counter 
     strPtr++;   // Go to the next char in the string. 
    } 

    return times; 
} 

學生改變了這樣的功能,它已空終止爲\10,這並沒有引起編譯也不運行時錯誤。玩過之後,我發現它也可能是\1並且仍然有效。這怎麼可能。我是一個完全noob,所以我很抱歉如果這是一個愚蠢的問題,但我認爲這是一個布爾運算符,1是真的,0是錯誤的。問題是爲什麼\10\1將作爲空終止符。先謝謝你!

+0

'\ number'指轉義序列編寫由數字代碼的象徵,就像'\ xnumber'不一樣的,但現在你在十六進制指定它。在語法方面,除了只有''\ 0'(在字符串外部也可以表示爲'\ x00''或者甚至只是'0')時,這裏沒有任何錯誤是一個有效的空終止符。 – Havenard

+0

請注意''\ 1''和其他數字不「仍然有效」。該程序要麼有運行時錯誤,要麼有幸運。幸運的是,我的意思是你的'while'循環不斷讀取數組的末尾,並進入具有不可預知值的內存中。這種語言不會阻止你編寫這樣的代碼,但這就是所謂的「未定義的行爲」。什麼事情都可能發生。例如,你可能很幸運,並且恰好在下一個位置有一個值爲'1'的字節,並且你的程序看起來工作正常。或者沒有和你的程序永遠循環。或者是其他東西。它沒有定義。 – Adam

回答

-1

「\ 0」是唯一被稱爲NULL終止符的。即使「\ 1」或「10」或甚至「\ 103」工作,只有「\ 0」被稱爲NULL終止符。我會解釋爲什麼。

在「\ 0」中,0表示ascii表中的OCT值(見下圖)。在ascii表中,沒有字符的OCT值爲0,因此,如果我們嘗試使用0,它被稱爲NULL終止符,因爲它指向地面並且沒有意義或有用。

現在爲什麼「\ 10」和「\ 1」有效?因爲這些涉及OCT值1和10,它們可以映射到ascii表上的字符,特別是標題的開始Baskspace。類似地,如果您選擇指向字母,標點符號或數字的OCT值(例如「\ 102」指向B,則它將輸出B.

如果您嘗試輸入無效數字,如「 \ 8「,那麼它只會在屏幕上輸出8,因爲它不會引用ascii表上的有效字符。

看到這個代碼,它總結了所有不同類型的指針:

#include <iostream> 

using namespace std; 

int main(void) 
{ 
    cout << "\0" << endl; // This is NULL; points to the ground 
    cout << "\8"; << endl; // Invalid OCT value; outputs invalid number input with only a warning. No compilation error. Here, 8 will be output 
    cout << "\102"; // Valid; points to B. Any valid OCT value will point to a character, except NULL. 
} 

Ascii Table


編輯:經過一番研究之後,我注意到,正確的使用轉義序列確實與只有最少3個數字。因此,在八進制方法之後,即使NULL終止符在技術上也應該寫爲「\ 000」。但是,如果編譯器沒有以八進制格式寫入,編譯器可以明顯地告訴哪個八進制值被引用到甚至。換句話說,編譯器將「\ 1」解釋爲「\ 001」。只是一些額外的信息。

我發現這方面的資料:C++ Character Literals

+0

你的第三個例子會輸出'f'。因爲這是十進制文字,而不是八進制。八進制文字以0開頭。說明使用這些值時會發生什麼,它的危險是什麼,以及爲什麼循環會停止,即使在字符串內部沒有帶有該代碼的符號也會顯着改善答案。 –

+0

不,@Revolver_Ocelot,它確實輸出「B」,我現在就自己嘗試。事實上,我自己對這件事感到非常驚訝,因爲我也認爲它遵循十進制。 –

+0

你是對的。在轉義序列中,所有數字都被視爲八進制數字,除非第一個符號是「x」。 –

3

'\0'表示「具有整數表示0的字符」。類似地,'\10'表示「具有整數表示10的字符」。這就是爲什麼它不是編譯錯誤 - 只是一個邏輯錯誤。