0

我在编写 c 代码方面是 3 周的新手,所以我是一个新手,只是尝试在线托管的哈佛课程视频中的一些示例。我正在尝试编写一些代码来根据关键字加密文件。

关键是字母表中的每个字母都会被分配一个从0到25的数值,所以'A'和'a'将是0,同样'z'和'Z'将是25。如果关键字是'abc ' 例如,我需要能够将其转换为数字形式,即 '012'。我尝试采用的方法(对许多 c 函数一无所知)是在数组中分配字母列表。我认为在讲座中他暗示了一个多维数组,但不确定如何实现它。问题是,如果字母表存储为数组,那么字母将是数组的实际值,我需要知道如何根据值搜索数组,我不知道该怎么做(到目前为止,我只是根据索引返回值)。一世' 我想要一些伪代码帮助,所以我可以解决这个问题。谢谢

4

5 回答 5

0

这很难回答,不知道你到目前为止学到了什么,但这里有一个提示我会做什么:表示字母的字符是表示它们的 ASCII 值的字节,并且顺序出现,从 a 到 z 和 A 到 Z他们不是从零开始的。您可以将它们转换为整数并获取 ascii 值。

这是我如何编写它的伪代码:

Cast the character to a number
IF it's between the ascii values of A and Z, subtract it from A
ELSE Subtract it from the ASCII value of a or A
Output the result.

对于它的价值,我没有看到涉及多维数组的问题的明显解决方案。

于 2012-08-16T04:34:31.657 回答
0
  • char '0' 是值 48
  • char 'A' 是值 65
  • char 'a' 是值 97

你说你想学习如何在数组中搜索:

char foo[26]; //your character array 

...
...
  //here is initialization of the array
for(int biz=0;biz<26;biz++)
 {
    foo[biz]=65+biz; // capital alphabet
  }
 ...
 ...
 //here is searching 1 by 1 iteration(low-yield)
char baz=67;   //means we will find 'C'
for(int bar=0;bar<26;bar++)
{
    if(foo[bar]==baz) {printf("we found C at the index: %i ",bar);break;}
}

 //since this is a soted-array, you can use more-yield search algortihms.

二分搜索算法(你可以在后面的章节中使用): http ://en.wikipedia.org/wiki/Binary_search_algorithm

于 2012-08-16T04:43:39.693 回答
0

在 C 中,achar是一个 8 位整数,因此,假设您的字母是有序的,您实际上可以使用该char值通过使用第一个字母 (a) 作为偏移量来获取索引:

char offset = 'a';
char value  = 'b';
int index = value - offset; /* index = 1 */
于 2012-08-16T05:11:42.743 回答
0

多维数组的用途是将小写和大写字母都存储在一个数组中,以便它们可以被映射。一种有效的方法是使用他们的ASCII代码,但是由于您是初学者,我想这个示例将向您介绍如何处理for loopsand multidimensional arrays,我认为这也是讲师的计划。

让我们首先为字母设置数组。我们将有两行,每行有 26 个字母:

alphabetsEnglish[26][2] = {{'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'},
                           {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'}};

现在我们可以映射这两种情况的元素。

int main()
{
    int c,i,j;
    char word[10]; 

    printf("Enter a word:");
    scanf("%s",word);

    c=strlen(word);
    printf("Your word has %d letters ", c);

    for (i = 0; i < c; i++) //loop for the length of your word
    {
        for (j = 0; j <= 25; j++) //second loop to go through your alphabet list
        {
            if (word[i] == alphabetsEnglish[0][j] || word[i] == alphabetsEnglish[1][j]) //check for both cases of your alphabet
            {  
                printf("Your alphabet %c translates to %d: ", word[i], j);
            }
        }
    }
    return 0;
}
于 2012-08-16T05:23:30.343 回答
0
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int *conv(char* str){
    static const char* table = "abcdefghijklmnopqrstuvwxyz";
    int size, *ret, *p;
    if(NULL==str || *str == '\0') return NULL;
    size = strlen(str);
    ret=p=(int*)malloc(size*sizeof(int));
    while(*str){
        char *pos;
        pos=strchr(table, tolower(*str++));
        *p++ = pos == NULL ? -1 : pos - table;
    }
    return ret;
}

int main(void){
    char *word = "abc";
    int i, size = strlen(word), *result;
    result = conv(word);
    for(i=0;i<size;++i){
        printf("%d ", result[i]);//0 1 2
    }
    free(result);
    return 0;
}
于 2012-08-16T12:22:51.210 回答