我正在尝试从Excel,AC8,AAA8和DADFAF145等Excel单元格数中获取坐标。
我从用户那里读到了这样的输入:
while( ( c = getchar() ) != EOF )
在周期中我有一个条件
if( c >= 48 && c <= 57 )
{
ungetc( c, stdin );
scanf( "%d\n", &column ); }
检查c是否为数字0-9,将c返回缓冲区并读取数字。数字是y坐标。
我的问题是我不知道如何从字符中获取X坐标。我无法弄清楚算法。
指数A = 0,Z = 25,共26个字符。如果有一个char,那没关系。如果有更多的字符,我不知道如何解决。
一些例子:
A5 => [5,0] Z8 => [8,25] AAA2345 => [2345,702] (26+26*26) PA12 => [12,416] (26+15*26) AC23 => [23,28] NBFA349 => [349,247572]
答案 0 :(得分:2)
这些字母组合实际上是base-26,但是数字不是0到25,而是1到26(并且由A到Z的字母表示)。所以你可以从字符串的末尾移动到开头,将数字乘以{str[i]-'A'+1
,其中str[i]
是字符串str
的第i个字符,我从{{1}运行0)到相应的26的力量。就像那样:
strlen(str)
您必须从右向左移动,因为例如,数字28写为int c = 1, s = 0;
for(int i = strlen(str)-1; i>=0; i--) {
s += (str[i]-'A'+1)*c; c*=26;
}
(而不是AB
)
答案 1 :(得分:0)
以下内容可能有所帮助。它定义了一个函数,它返回一个字符串的列号,如&#34; ADX&#34;。如果您在Excel电子表格中的该列的单元格中输入函数=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
答案 2 :(得分:-1)
//"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;
}