将 A1 格式转换为 R1C1 格式

标签 c

作为我上一个问题的跟进 here .

我正在尝试与上一个问题相反的问题。也就是说,将 A1 形式的输入转换为 R1C1 形式的输出(有关更多信息,请查看我的上一个问题)。

我将解释我的算法。假设我们需要将 BC23 转换为 R23C55。我从 BC23 中提取了“BC”和“23”并将它们存储在单独的数组中。我制作了另一个数组,当它们输入时分别为 A、B、C 存储值 1、2、3...等等。例如,我的数组将包含 2 和 3 作为 B 和 C 的前两个元素。然后我使用一些数学将其转换为数字,在本例中为 55 表示 BC。

这是完整的代码。

#include <stdio.h>
#include <string.h>
#include <math.h>

int main()
{
    char str[5],col[5],row[5];
    int i=0,j=0,k=0,lenOfstr,lenOfcol;
    scanf("%s",str);

    while(str[i]>='A'&&str[i]<='Z')
    {
        col[j]=str[i];
        i++;
        j++;
    }
    col[j]='\0';
    lenOfstr=strlen(str);
    lenOfcol=strlen(col);

    int ascCol[lenOfcol];

    for(i=lenOfcol;i<lenOfstr;i++)
    {
        row[k]=str[i];
        k++;
    }
    row[k]='\0';

    for(i=0;i<lenOfcol;i++)
    {
        ascCol[i]=col[i]-64;
    }

    int sum=0;
    for(i=0;i<lenOfcol;i++)
    {
        sum=sum+(ascCol[i]*pow(26,lenOfcol-i-1));
    }

    printf("%d",sum);

    return 0;
}

最后一段代码中有一个我无法调试的小错误。

    int sum=0;
    for(i=0;i<lenOfcol;i++)
    {
        sum=sum+(ascCol[i]*pow(26,lenOfcol-i-1));
    }

    printf("%d",sum);

输入 Z 应该给我输出 26,AA 应该给我输出 27。但是我的代码在两者上都给出 26。此后输出总是比正确输出少 1; BC 给出 54 而不是 55。

有人帮帮我。

最佳答案

尝试将总和更改为:

sum = sum * 26 + ascCol[i]

这避免了因 pow 返回 float 而导致的意外浮点舍入行为和其他问题。

请注意,您可以将整个程序简化为:

#include <stdio.h>

int main()
{
    char str[5];

    scanf("%s", str);

    int i = 0;
    int sum = 0;    
    while(str[i] >= 'A' && str[i] <= 'Z')
    {
        sum = sum * 26 + (str[i] - 'A');
        i++;
    }

    printf("%d", sum);

    return 0;
}

关于将 A1 格式转换为 R1C1 格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29684874/

相关文章:

C : pointer and union and address

c++ - 有没有办法忽略 hg blame 中的提交?

c - 为什么 read 不起作用但 fgets 在我的程序中工作正常?

c - 如何为 typedef 结构正确分配内存

c++ - 为什么当我在数组外部写入时我的程序不会崩溃?

c - 另一个计数器给一个计数器赋值,防止计数器递增?

c - 关于如何在 C 结构中表示缓冲区

c - 如何检索最接近平均值及其位置 C

c - 使用节点结构时的段错误

c++ - 为什么 memcpy() 和 memmove() 比指针增量快?