2015-07-19 73 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