变量在C中被覆盖

时间:2017-11-11 12:15:51

标签: c pointers char

我在C:

中有这个功能

Map<String,String> datanum = new HashMap<String, String>();

Tihs函数接收两个指向x和y以及一个字符数组的指针。该条目包含一些像这样的坐标:'a7','h13','b9','d11'并且必须将字母转换为整数(x)并且数字相同。 例如,如果输入为'h13',则x将为8和y 13。

所以这是我的函数的完整代码:

void convertXY(int* x, int* y, char entry[3]);

我的void convertXY(int* x, int* y, char entry[3]) { int i; char alphabet[26] = "abcdefghijklmnopqrstuvwxyz"; if(entry[2] == NULL) // if the entry is something like 'a1' we must change it to 'a01' { entry[2] = entry[1]; entry[1] = '0'; } for(i = 0; i < 26; i++) // we convert the letter into a number { if (alphabet[i] == entry[0]) *y = i; } *x = charToInt(entry[1]) * 10 + charToInt(entry[2]); // we convert entry[1] and entry[2] from char to int using powers of 10 (10^0 and 10^1). } 功能:

charToInt

问题是当我使用这个函数时,我的一些变量会被覆盖。我不知道为什么会这样。例如:

int charToInt(char character)
{
    int i;
    char numbers[10] = "0123456789";

    for(i = 0; i < 10; i++)
        if(numbers[i] == character)
            return i; 
}

1 个答案:

答案 0 :(得分:1)

如果您要存储3个charcaters,包括\0存储空间必须为char entry[4]。否则,它是未定义的行为。

您不想查看NULL。你想知道的是它的长度是否为2。

if(strlen(entry)==2) // if the entry is something like 'a1' we must change it to 'a01'
    {
        entry[2] = entry[1];
        entry[1] = '0';
    }
如果您了解ascii值,

charToInt就像这样简单。我根据上下文更改了函数名称。

int digitToInt(char digit)
{
      if( digit <= '9' && digit >= '0') 
      return c-'0';
      return -1;
}

字母到整数转换也是如此。如果您知道它总是在az之间,那么您可以这样做: -

void convertXY(int* x, int* y, char entry[3])
{


    if(strlen(entry) == 2) // if the entry is something like 'a1' we must change it to 'a01'
    {
        entry[3]='\0';
        entry[2] = entry[1];
        entry[1] = '0';
    }

    *y = (entry[0]-'a')+1;
    *x = (entry[1]-'0') * 10 + (entry[2]-'0'); // we convert entry[1] and entry[2] from char to int using powers of 10 (10^0 and 10^1).
}

variable命名很糟糕我会说 - 我从未遇到过变量名为variable的代码)是一个局部变量,你要改变它因为convertXY,所以你可以传递地址o变量,或者一旦你完成调用函数,就使用xy更改的值来反映变量{{1 }}