2013-07-08 2 views
-2
int get_max_horizantal() 
{ 
    char str[2]; 
    char strb[2]; //Everything works well unless I put this 
    extern char shit[1200]; 
    int x,number; 
    while((3*x+1)<1200) 
    { 
     if(number%17==0 && number!=0) 
     { 
      x+=2; 
      number=-1; 
     } 
     str[0]=shit[3*x]; 
     str[1]=shit[3*x+1]; 
     int val1=atoi(str); 
     printf("%d\n",val1); 
     x++; 
     number++; 
    } 
} 

Ok так это то, что я не получаю вообще ... Вся функция работает хорошо, но когда я ставлю этот обугленного STRB [2]; printf ничего не печатает и ошибок компиляции или предупреждений нет ... На этот раз мне действительно нужна помощь в этом ... Спасибо заранее.Инициализация переменной вызывает Printf прекратить работу

+5

Пожалуйста, не назовите вашу переменную 'shit' –

+0

@YuHao LOOL .... – Maroun

+0

' x' и 'number' используются неинициализированные. – Kninnug

ответ

3

Если вы хотите использовать atoi в массиве char, вы должны положить нулевой ограничитель в конце. Добавление вещей в стек, изменение поведения часто означает, что вы ушли с конца некоторой памяти. Сделать ул больше и добавить нуль в конце:

char str[3]; 
str[2] = 0; 
+0

Спасибо большое: D Мне понадобится много времени, чтобы привыкнуть к C hehe: D –

+0

Спасибо, но это все еще не работает ... Все тот же –

3

atoi хочет правильную строку. То, что вы передаете, не является правильной строкой, поскольку оно не завершено nul. Это приводит к неопределенному поведению, которое в вашем случае представляет собой, казалось бы, несвязанное изменение, заставляющее вещи работать или не работать.

+0

Я вижу ... Большое спасибо ..Я думаю, что мне понадобится очень много времени, чтобы на самом деле научиться использовать C хорошо .. Все благодарности: D –

+0

Вам понадобится намного больше времени и некоторое чтение, чтобы узнать C. Будьте терпеливы, много работайте и много читайте. –

2

Функция atoi(3) ожидает строку с нулевым завершением, то есть массив из char, содержащий нулевой байт (который условно завершает строку).

Вы должны дать не менее 3 символов до str и обнулить их перед их заполнением, либо с помощью memset или явно очистки последнего байта:

char str[3]; 
/* possible alternative: 
    memset (str, 0, sizeof(str)); // the compiler will optimize that... 
*/ 
str[0] = shit[3*x]; 
str[1] = shit[3*x+1]; 
str[2] = (char)0; 

Пожалуйста, возьмите привычку позволяет все предупреждения и информацию об отладке во время компиляции (например, скомпилировать с gcc -Wall -g в Linux) и узнать, как использовать отладчик (gdb в Linux).

Я уверен, что ваш компилятор может предупредить вас, что x и number не инициализируются, и вы должны исправить:

int x=0, number=0; 

Как правило, улучшить свой исходный код до каких-либо предупреждений предоставлены вашим компилятором (со всеми предупреждениями, запрошенными, например, -Wall и, возможно, даже -Wextra при использовании gcc). Затем используйте отладчик для отладки кода: на Linux в p или print, s или step, d или display, bt или backtrace команды gdb должны стать знакомы.


Рассмотрите возможность использования snprintf(3) (но не использовать устаревшие и небезопасные sprintf).


Подробнее ... Undefined Behavior. Вероятно, ваша программа может работать (из-за отсутствия удачи), но будет ошибкой.

+0

Спасибо, но это все еще не работает ... Все тот же –

+0

Что не работает? –

+0

Это все еще ничего не печатает, когда я инициализирую str2 Я вообще не получаю это –

Смежные вопросы