了解Char到ASCII转换功能

时间:2016-10-03 05:21:41

标签: c++ char ascii

我如何在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];
}

我很想学习如何使用这个功能。谢谢。

2 个答案:

答案 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一样的测试。测试并祈祷任何提供弦的人都能正确地终止它。