我正在为我正在学习的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;
}

学生更改了函数,使其具有null终止符作为\10,这不会导致编译或运行时错误。玩了之后,我发现它也可以是\1并仍然可以使用。这怎么可能。我是一个完全菜鸟,所以如果这是一个愚蠢的问题,我深表歉意,但是我认为这是 bool(boolean) 运算符,并且1为true,0为false。问题是,为什么\10\1可以用作空终止符。先感谢您!

最佳答案

“\ 0”是唯一被称为NULL终止符的字符。即使“\ 1”或“10”甚至“\ 103”起作用,也只有“\ 0”被称为NULL终止符。我会解释原因。

在“\ 0”中,0表示ascii表中的OCT值(请参见下图)。在ascii表中,没有OCT值为0的字符,因此,如果我们尝试使用0,则它被称为NULL终止符,因为它指向基础并且没有任何意义或意义。

现在,为什么“\ 10”和“\ 1”起作用?因为它们是指OCT值1和10,它们可以映射到ascii表上的字符,特别是Heading of Heading和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.
}

c&#43;&#43; - 空终止符\1?-LMLPHP

编辑:经过一些研究,我注意到使用转义序列的正确方法的确确实是至少 3个数字。因此,按照八进制方法,即使是NULL终止符,技术上也应写为“\ 000”。但是,即使不是以八进制格式编写的,编译器显然也可以知道要引用哪个八进制值。换句话说,编译器将“\ 1”解释为“\ 001”。只是一些额外的信息。

我在以下位置找到了此信息:C++ Character Literals

10-08 13:42