我正在为我正在学习的初学者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
将作为空终止符。提前谢谢!
答案 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.
}
编辑:经过一些研究后,我注意到使用转义序列的正确方法确实是仅 3个数字。因此,即使是NULL终止符,在技术上也应该按照八进制方法写成“\ 000”。但是,编译器显然可以告诉哪个八进制值被引用到甚至,如果它不是以八进制格式写的。换句话说,编译器将“\ 1”解释为“\ 001”。只是一些额外的信息。
我在以下网址找到了此信息:C++ Character Literals