单元格的坐标在Excel中

我试图从A5,AC8,AAA8和DADFAF145等Excel单元格中获取坐标。

我读这样的用户input:

while( ( c = getchar() ) != EOF ) 

在这个循环中,我有一个条件

 if( c >= 48 && c <= 57 ) { ungetc( c, stdin ); scanf( "%d\n", &column ); } 

它检查c是否是数字0-9,将c返回到缓冲区并读取数字。 数字是y坐标。

我的问题是,我不知道如何从字符得到X坐标。 我找不出一个algorithm。

指数为A = 0,Z = 25,总共26个字符。 如果有一个字符,没关系。 如果有更多的字符,我不知道如何解决。

一些例子:

 A5
  => [5,0]

 Z8
  => [8,25]

 AAA2345

  => [2345,702](26 + 26 * 26)
 PA12
  => [12,416](26 + 15 * 26)


 AC23
  => [23,28]

 NBFA349
  => [349,247572]

这些字母组合实际上是以26为底,但是这些数字不是从0到25,而是从1到26而不是从A到Z的字母。 所以你可以从string的末尾移动到开头,乘以数字( str[i]-'A'+1其中str[i]是stringstr的第i个字符,我从strlen(str)到0)到相应的26次方。像这样:

 int c = 1, s = 0; for(int i = strlen(str)-1; i>=0; i--) { s += (str[i]-'A'+1)*c; c*=26; } 

你必须从右向左移动,因为,例如,28号写成AB (而不是BA

以下可能会有所帮助。 它定义了一个返回像“ADX”这样的string的列号的函数。 它与您在Excel电子表格的该列中的单元格中input函数=Column()将看到的内容相符:

 #include <stdio.h> #include <string.h> long col_num(char* col); int main(void){ char test1[] = "Z"; char test2[] = "AA"; char test3[] = "BZA"; printf("Column %s is column number %ld\n",test1,col_num(test1)); printf("Column %s is column number %ld\n",test2,col_num(test2)); printf("Column %s is column number %ld\n",test3,col_num(test3)); return 0; } long col_num(char* col){ long sum, i, n, p, val; char letter; n = strlen(col); sum = 0; p = 1; for(i = n-1; i >= 0; i--){ letter = col[i]; val = letter - 'A' + 1; sum += p*val; p *= 26; } return sum; } 

我差点忘了。 输出:

 Column Z is column number 26 Column AA is column number 27 Column BZA is column number 2029 
 //"A" => 1, "Z" -> 26, "AAA" => 703, "NBFA" => 247573 int colToNum (const char *s){ int n = 0; for(int i = 0; s[i] ; ++i) n = n * 26 + (s[i] - 'A' + 1); return n;//To zero origin : return n-1; }