2015-07-19 49 views
0

我想从Excel的单元格像A5,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个字符的索引。如果有一个字符,就没关系。如果有更多的字符,我不知道如何解决。

一些例子:

 
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

所以,你正在寻找一个C函数,饲喂时像“NBFA字符串“返回247572? –

+2

你为什么要关闭它?这是一个完全有效的问题。 – fuz

+0

此外 - 为什么A5会翻译为[5,0]?它不是[4,0]或[5,1]?您的行被设为基于1的索引但基于0的列似乎不一致。 –

回答

2

这些字母组合实际上是碱基26,然而,数字是不是从0到25,但1至26,而不是(和由字母A代表的Z)。所以你可以从字符串的末尾移动到开头,将数字(str[i]-'A'+1,其中str[i]是字符串的第i个字符str,我从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

+0

太好了,谢谢!坐标是否正确? – Levin

+0

@Levin是的,在s – hyst329

-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; 
} 
+0

你知道预付号码的携带吗?例如0,1,2,3 ... 9,10:1(0 ..9,一个10号码持有)0,像A,B ... Y,Z,AA:A(一个26号码)A – BLUEPIXY

0

以下可能的帮助。它定义了一个函数,它返回字符串的列号,如“ADX”。

#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; 
} 

我差点忘了:它用,如果你在一个单元格的列在Excel电子表格输入功能=Column()你会看到什么一致。输出:

Column Z is column number 26 
Column AA is column number 27 
Column BZA is column number 2029