C语言中的字符配对

C语言中的字符配对,c,C,我正在编写一个代码,读取一个文本文件,然后计算一对字母出现的实例数。例如,包含“aabbaa”的文本文件 发生次数为aa=2、ab=1、ba=1 我想我可以使用这样的2D阵列: 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','

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

发生次数为aa=2、ab=1、ba=1

我想我可以使用这样的2D阵列:

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'};
但这只会返回一封信


任何帮助都将不胜感激

在c++语言中,请根据需要转换变量声明、注释等


重要提示:如果您声明一个
char
-数组,那么如果组合出现超过255次,条目将溢出,因此我将把它改为
long

还要记住,2D数组应该为您使用的字母表中的每个字母都有索引。我将假设其中为26个字母(例如,仅ascii小写):

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

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

FILE*f=fopen(文件名,“rb”);//(todo:如果返回0,则添加错误处理)
fseek(f,0,SEEK_END);
int len=ftell(f);
fseek(f,0,SEEK_集);
char*yourInput=malloc(len+1);//(todo:如果返回0,则添加错误处理)

fread(你的输入,1,len,f);//(todo:如果有更好的方法来做你想做的事情,请添加你的错误处理。你使用此方法的原因是什么?还有,你的输入数据有多大?你在示例中错过了一个配对,不是吗?你也应该有一个
bb=1
。无论如何……你现在可以显示你当前的代码是如何查找事件的吗?你是否正在循环h那个数组在寻找字符串中匹配的对吗?你需要一个26乘26的数组,值
'a'
'b'
等应该用来计算索引,而不是数组元素的值。为什么不bash?
egrep-o'[a-Za-z]{2}'input.txt | sort | uniq-c
@eduffy:你试过你的代码了吗?它在
aabbaa
中找不到
ab
ba
。你不需要将
current
/next
的值转换为0吗?或者你是在暗示他的
阅读器正在这样做吗?否则
charPair[current][next]+=1;
将是一种错误的寻址方式。@TravisGriggs是的,我有点疏忽,正在修复它,谢谢。您建议如何获取下一个字符?目前我从文件中获取字符的方式是使用.int character=fgetc(文件),然后使用putChar(字符)显示character@Uhsheesh添加了有关如何从输入文件中获取输入的信息。
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
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;
}
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);