我正在为我正在学习的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.
}
编辑:经过一些研究,我注意到使用转义序列的正确方法的确确实是至少 3个数字。因此,按照八进制方法,即使是NULL终止符,技术上也应写为“\ 000”。但是,即使不是以八进制格式编写的,编译器显然也可以知道要引用哪个八进制值。换句话说,编译器将“\ 1”解释为“\ 001”。只是一些额外的信息。
我在以下位置找到了此信息:C++ Character Literals