C++ 在C中使用字符作为数组索引?

C++ 在C中使用字符作为数组索引?,c++,c,arrays,vector,C++,C,Arrays,Vector,我有以下代码: int main(){ char vector[52]; char i; /* initialize the vector */ for (i ='a'; i < 'z'; i++){ vector[i] = i - 'a' + 1; } // vector is like vector['a'] = 1, vector['b'] = 2 .. vector['z'] = 26 for (i ='A'; i <= 'Z';

我有以下代码:

int main(){

  char vector[52];
  char i;

  /* initialize the vector */
  for (i ='a'; i < 'z'; i++){
    vector[i] = i - 'a' + 1;
  } 
  // vector is like vector['a'] = 1, vector['b'] = 2 .. vector['z'] = 26


  for (i ='A'; i <= 'Z'; i++){
    vector[i] = i - 'A' + 27;
  }
  // vector is like vector['A'] = 27, vector['B'] = 28 .. vector['z'] = 52

  for (i ='a'; i <= 'z'; i++){
    printf("letter %c : %d \n", i, vector[i]);
  } 

  for (i ='A'; i <= 'Z'; i++){
    printf("letter %c : %d \n", i, vector[i]);
  }

  return 0;
}
我不明白为什么要发出这个错误消息。 我应该有这样一个向量:

vector['a'] = 0, vector['b'] = 1,  .., vector['z'] = 26, vector['A'] = 27, vector['B'] = 28, .., vector['Z'] = 52
我知道我有这个向量,但错误也随之而来。
如何解决这个问题?

因为“Z”不等于“Z”

“Z”等于90,向量只有52个元素。你的最高指数是51,所以你基本上是出界了

例如,当你这样做的时候

  for (i ='A'; i <= 'Z'; i++)
  {
    vector[i] = i - 'A' + 27;
  }
for(i='A';i
for(i='A';i
因此,
vector
的可访问索引是0到51-

for (i ='A'; i <= 'Z'; i++) // 'A' = 65 and 'Z' = 90
{
    printf("letter %c : %d \n", i, vector[i]);
}
(i='A';i的


(虽然我不太确定“something”可能是什么。)

首先,一个旁注:您的第一个for循环还需要包括“z”。因此:

for (i ='a'; i <= 'z'; i++){
意味着您有一个大小为52的数组。数组的有效索引为0到51。但是,当您编写一个类似
'a'
的字符时,它实际上只是一个数字,它是字符
a
的ascii码(即0x61,即61十六进制)。您使用的最高索引是
'z'
,它是122。因此,您的数组需要索引122有效,因此必须具有至少123的大小

因此,您的代码如下所示:

int main(){

  char vector[123];
  char i;

  /* initialize the vector */
  for (i ='a'; i <= 'z'; i++){
    vector[i] = i - 'a' + 1;
  } 
  // vector is like vector['a'] = 1, vector['b'] = 2 .. vector['z'] = 26


  for (i ='A'; i <= 'Z'; i++){
    vector[i] = i - 'A' + 27;
  }
  // vector is like vector['A'] = 27, vector['B'] = 28 .. vector['z'] = 52

  for (i ='a'; i <= 'z'; i++){
    printf("letter %c : %d \n", i, vector[i]);
  } 

  for (i ='A'; i <= 'Z'; i++){
    printf("letter %c : %d \n", i, vector[i]);
  }

  return 0;
}
然后你说:

我应该有这样一个向量:

vector['a'] = 0, vector['b'] = 1,  .., vector['z'] = 26, vector['A'] = 27, vector['B'] = 28, .., vector['Z'] = 52

如果你想让
向量['a']
从0开始,而不是从1开始,你应该把你的公式从
向量[i]=i-'a'+1;
改为
向量[i]=i-'a';

改为
字符向量[53];
。你越界了。你到底想干什么?!
向量['a']
已经超出了大小为52的数组的范围。a
的ASCII值是多少?您可能想熟悉ASCII值。它不是指“ASCII值”。它是指平台编码中“a”的任何数值。很抱歉,我的矛盾,我的意思是:向量类似于向量['a']=1,向量['b']=2..vector['z']=26,而不是第二种情况
for (i ='A'; i <= 'Z'; i++) // 'A' = 65 and 'Z' = 90
{
    printf("letter %c : %d \n", i, vector[i]);
}
  char vector[52];
  for (i ='a'; i < 'z'; i++){
    vector[i] = i - 'a' + 1;
  } 
    vector[i-'a] = something;
for (i ='a'; i <= 'z'; i++){
char vector[52];
int main(){

  char vector[123];
  char i;

  /* initialize the vector */
  for (i ='a'; i <= 'z'; i++){
    vector[i] = i - 'a' + 1;
  } 
  // vector is like vector['a'] = 1, vector['b'] = 2 .. vector['z'] = 26


  for (i ='A'; i <= 'Z'; i++){
    vector[i] = i - 'A' + 27;
  }
  // vector is like vector['A'] = 27, vector['B'] = 28 .. vector['z'] = 52

  for (i ='a'; i <= 'z'; i++){
    printf("letter %c : %d \n", i, vector[i]);
  } 

  for (i ='A'; i <= 'Z'; i++){
    printf("letter %c : %d \n", i, vector[i]);
  }

  return 0;
}
// vector is like vector['a'] = 1, vector['b'] = 2 .. vector['z'] = 26
vector['a'] = 0, vector['b'] = 1,  .., vector['z'] = 26, vector['A'] = 27, vector['B'] = 28, .., vector['Z'] = 52