1

我正在编写一个读取文本文件的代码,然后计算一对字母出现的实例数。例如,包含“aabbaa”的文本文件

出现次数为aa=2,ab=1,ba=1

我在想我可以使用这样的二维数组:

char charPair[25][25] =   {'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'};

但这只会返回一封信。

任何帮助,将不胜感激!

4

2 回答 2

3

重要提示:如果您声明一个char-array,则如果组合出现超过 255 次,条目将溢出,因此我将其更改为long.

另请记住,您的二维数组应该为您使用的字母表中的每个字母提供索引。我假设它是 26 个字母(例如只有 ascii 小写):

long charPair[26][26];
memset(charPair, 0, 26*26*sizeof(long));
char* reader = yourInput;
char current = *reader-'a';
++reader;
char next = *reader-'a';
while(next!=0) { // assumes \0-terminated
    charPair[current][next] += 1;
    current = next;
    next = *reader-'a';
    ++reader;
}

-'a''s 是这样的,字母 a 的行/列为 0,z 的行/列为 26 。

编辑:关于您对如何最好地阅读输入的评论:上面的代码假设整个输入被放入一个字符串(\0 终止)

FILE* f = fopen(filename, "rb"); // (todo: add your error handling if 0 returned)
fseek(f, 0, SEEK_END);
int len = ftell(f);
fseek(f, 0, SEEK_SET);
char* yourInput = malloc(len+1); // (todo: add your error handling if 0 returned)
fread(yourInput, 1, len, f); // (todo: add your error handling if <len returned)
yourInput[len] = '\0';
fclose(f);
于 2013-02-15T21:16:08.727 回答
0

在 c++'ish C 中,请根据需要转换变量声明、注释等...

...

char tCharPairCount[26][26]; // Lower-Case strings only
memset(tCharPairCount,0,26*26);

char tPrevChar = tempString[0];
for(int i=1; i<tempString.length(); ++i ) 
{
   char tCurrentChar = tempString[i];
   ++tCharPairCount[tPrevChar-'a'][tCurrentChar-'a'];
   tPrevChar = tCurrentChar;
}

...

// 迭代结果

for(i:0->25)
for(j:0->25)
 printf("%i",tCharPairCount[i][j]);  // 0,0 => aa ; 1,0 => ba
于 2013-02-15T21:00:25.677 回答