У меня проблема в моей программе на C; Я не знаю, почему мой 2D-массив дает мне отрицательные числа.2D-массив + = 1 дает мне отрицательные числа
Я memset
массив:
memset(array , 0 , sizeof(array[0][0]) * 26 * 26);
И я просто прочитать файл, и когда у меня есть 2 символов между «а» и «г» Я просто:
array[c - 'a'][d - 'a'] += 1;
Имея
char c , d;
Но когда я делать
printf("le : %d\n" , array['l' - 'a']['e' - 'a']);
я получаю:
le : -34
Но это просто невозможно.
Вот полный код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main (int argc , char * argv[])
{
char proba[26][26];
memset(proba , 0 , sizeof(proba[0][0]) * 26 * 26);
FILE * fic;
char c , d;
fic = fopen(argv[2] , "r");
if(fscanf(fic , "%c" , &c) != 1) return 2;
while(!feof(fic))
{
if(fscanf(fic , "%c" , &d) == 1)
{
if(c >= 'a' && c <= 'z' && d >= 'a' && d <= 'z')
{
printf("%c%c %d - " , c , d , proba[c - 'a'][d - 'a']);
proba[c - 'a'][d - 'a'] += 1;
}
}
c = d;
}
fclose(fic);
printf("\nProbability of %c%c is %f\n" , argv[1][0] , argv[1][1] , (float)proba[argv[1][0] - 'a'][argv[1][1] - 'a']/(26 * 26));
}
// use ./main le file.txt
EDIT: РЕШИТЬ - нуб ошибка, используя 2D массив символов, чтобы сохранить целые ...
Thx снова StackOverflow.
Вы пробовали * 'unsigned' *' char proba [26] [26]; '? Еще лучше сделайте массив 'int'. –
Джереми, я думаю, вы испытываете переполнение. char может удерживать только -128 до 127. Когда вы переходите через 127, вы «перетекаете» на -128. (Технически это неопределенное поведение, но большинство компьютеров будут работать с 127 до -128). Вам нужно использовать больший тип данных (например, int или short). Если вы хотите понять, почему это происходит, вы должны изучить, как работает представление чисел целых чисел 2. – Lalaland
Кроме того, в качестве комментария к стилю вы можете упростить одну из своих строк кода. 'memset (proba, 0, sizeof (proba [0] [0]) * 26 * 26);' лучше указывается как 'memset (proba, 0, sizeof (proba));' – Lalaland