我如何在c ++中使用此功能?它应该使用索引ip返回字符串p中字符的ASCII值。
#include <cstring>
int ascVal(size_t ip, const char* p)
{
// Return the ASCII value of the char
if(!p || ip > strlen(p))
return -1;
else
return p[ip];
}
我很想学习如何使用这个功能。谢谢。
答案 0 :(得分:2)
你似乎在“character”和“char buffer”之间误解了。
字符缓冲区是一个字符数组。 “ascval”函数中的“size_t”只是缓冲区中的字符数,从零开始索引。
为了您的理解,我调整了您的代码。它工作(未优化)
#include <iostream>
#include <cstring>
int ascVal(size_t ip, const char* p)
{
// Return the ASCII value of the char
if(!p || ip > strlen(p))
return -1;
else
return p[ip];
}
int main()
{
std::cout << ascVal(0,"a") << std::endl;
char *letter = new char;
*letter = 'a';
size_t asciiSize = 0;
int letterValue = letter[asciiSize];
std::cout << letterValue << std::endl;
}
答案 1 :(得分:0)
首先要运行该函数,因为你应该了解它正在做的所有事情以便欣赏它。
int ascVal(size_t ip, const char* p)
{
// Return the ASCII value of the char
if(!p // if p is NULL there is not string ergo nothing vcan be done with it
|| // boolean OR means if either condition is met
ip > strlen(p)) //the index of the requested character is NOT inside the string
return -1; // we can do nothing with input this bad. Return an error
else
return p[ip]; // get the ipth character in the string and return the character as
// an integer. This makes the character look like a number. It's
// really been a number the whole time but characters are treated
// and displayed to the user differently than an int
}
现在OP在做什么:
char *letter = new char; // dynamically allocating a block of memory exactly one
// character long
*letter = 'a'; // assigning the letter a to that one character
size_t asciiSize = 256;
int letterValue = letter[asciiSize]; // get the asciiSizeth (256th) character in the block
// of memory. Unfortunately there is no 256th
// character in that block of memory. This is bad.
cout << letterValue << endl; // print value of 256th character in bloc of one character.
与上述功能不同,OP不会验证letter
是否指向任何内容。这是一个没有实际意义的点,因为OP只是在上面设置了几行,并且很清楚letter
是一个有效的指针。 OP也没有确定asciiSize
指定的数组位置在数组内。
我认为,这就是我们遇到OP概念问题的地方。 OP似乎假设因为ASCII中有256个值,它们只能要求值256。
问题1:原点0
几乎所有的编程都从0开始计数。如果你有256个可能的值,那些值是0到255. 256太大了,会发生奇怪的事情。通常256会溢出并变为0,但我不会指望所有情况。
问题2:ASCII是7位
只有2个能量为7或128的ASCII值。因为我们通常将ASCII值放在8位数字中,所以人们已经找到了使用未使用的128个值的方法,但这通常由显示该值的任何内容的本地化或代码页设置来定义。不先检查就不要指望得到你想要的东西。
问题3:数组索引
letter[asciiSize]
是asciiSize
之后对letter
数组元素的请求。教科书是查找数组和索引详细信息的最佳位置,但重要的是你不应该要求你没有的内存,你不应该要求超出使用的数据。这将我们带到
半问题4:空终止
*letter = 'a'
只是指向恰好是'a'的单个字符的指针。这不是一个字符串。要成为一个字符串,您需要有一些大小调整信息或终结符,以便您知道何时停止读取字符串。在C中,终结符是字符值0.它从不用于对话,因此它是表示文本字符串结尾的完美标记。不要尝试将其用于二进制信息。 Binary有不同的规则。通常,提前知道二进制信息的确切大小,或者使用不可能出现在二进制流中的序列来标记结束,即终止符。在二进制0中非常常见,所以你通常必须选择别的东西。
我们知道letter
只指向一个字符,因为OP只放了一个字符。指针没有任何线索。这完全取决于程序员,如果程序员分配一个字符,然后询问第100个字符,那就是他们的问题。
所以要将letter
变成字符串
char *letter = new char[2];
*letter = 'a'; // same as letter[0] = 'a'
letter[1] = '\0'; // same as *(letter + 1) = '\0'
现在,如果需要,我们可以使用strlen
来确定字符串的长度。
把所有这些放在一起,如果你想要一个具有给定值的角色,比如说42,你所要做的就是
char val = 42;
显示val
会产生'*'
,符号分配给42.为什么'*'
?没有人知道,道格拉斯亚当斯死于试图找出答案。道格拉斯!我们向你致敬!
这里不需要数组索引。您只需要一份ASCII表格。
如果你真的想要一个字符串的第256个字符,你必须首先使一个字符串足够大,然后填充到第256个字符或更高。不要认为因为程序没有崩溃,所以没有第256个字符。首先测试与原始函数strlen
一样的测试。测试并祈祷任何提供弦的人都能正确地终止它。