空终结者\ 1?

时间:2017-02-19 05:34:27

标签: c++ c++11

我正在为我正在学习的初学者C ++课做一些编码。在课堂上,我们必须接受另一名学生提交的代码并修复他们创建的错误。代码如下:

#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并且仍然有效。这怎么可能。我是一个完整的菜鸟,所以我道歉,如果这是一个愚蠢的问题,但我认为这是一个布尔运算符,1为真,0为假。问题是为什么\10\1将作为空终止符。提前谢谢!

2 个答案:

答案 0 :(得分:4)

'\0'表示&#34;具有整数表示0的字符。&#34;类似地,'\10'表示具有整数表示10的字符。&#34;这就是为什么它不是编译错误 - 只是一个逻辑错误。

答案 1 :(得分:-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