2015-04-05 3 views
0

У меня проблема в моей программе на 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.

+3

Вы пробовали * 'unsigned' *' char proba [26] [26]; '? Еще лучше сделайте массив 'int'. –

+2

Джереми, я думаю, вы испытываете переполнение. char может удерживать только -128 до 127. Когда вы переходите через 127, вы «перетекаете» на -128. (Технически это неопределенное поведение, но большинство компьютеров будут работать с 127 до -128). Вам нужно использовать больший тип данных (например, int или short). Если вы хотите понять, почему это происходит, вы должны изучить, как работает представление чисел целых чисел 2. – Lalaland

+0

Кроме того, в качестве комментария к стилю вы можете упростить одну из своих строк кода. 'memset (proba, 0, sizeof (proba [0] [0]) * 26 * 26);' лучше указывается как 'memset (proba, 0, sizeof (proba));' – Lalaland

ответ

1

Просто измените

char proba[26][26]; 

в

int proba[26][26]; 

Вы уже используете %d в формате printf() спецификатора, и приведение к float позже.

+0

Да, спасибо, я не знаю, что я собирался написать что-то вроде. Это так плохо ... Спасибо: D –