2012-06-12 4 views
-1

Перед тем, как представить код, немного фона: У меня есть массив указателей символов по имени math, теперь, в петле while Я пытаюсь преобразовать значение в математике, чтобы int используя atoi и сохраняя его в переменной intai. Ошибок компиляции нет. Однако, когда я пытаюсь напечатать ai, он не печатает его. Как-то программа работает без сбоев. Я не могу понять, в чем проблема, и если есть проблема, программа должна потерпеть крах на atoi, и если нет проблемы, тогда она должна напечатать ai.Значение, возвращаемое atoi не может быть распечатана

код выглядит следующим образом:

int c1 = 3; //the array contains 3 characters 1 2 3 
int c2 = 0; 
while(c2 < c1) 
{ 
    int ai; 
    ai = atoi(math[c2]); 
    // the array is valid, I have checked it time and again so is the content in array 
    write(STDOUT_FILENO,math[c2],1); //this works fine. 
    write(STDOUT_FILENO,&ai,sizeof(&ai)); 
    //this doesn't print anything and somehow loop goes on to meet 
    //the condition. 
    c2++; 
} 
+0

что такое "математика [c2]"? Как это определяется? – trumpetlicks

+0

его c2 ++; на второй последней строке, извините за опечатку. – Salik

+0

math [c2] - массив указателей символов и определяется как: char * math [10]; – Salik

ответ

1

Помните, что write не printf. Так

write(STDOUT_FILENO,&ai,sizeof(&ai)) 

запишет sizeof(int) части персонажей, STDOUT; если мы предположим, что 32-битный int, он будет печатать символы, соответствующие в ASCII, кодовому значению (ai >> 24) & ff, (ai >> 16) & ff, (ai >> 8) & ff и (ai >> 0) & ff, что, возможно, четыре непечатаемых символа.

Если вы хотите написать строковое представление целого числа к консоли, используйте:

printf("%d", ai); 

вместо этого.

+0

Вы заметили, что вам нужно распечатать' ai' и NOT '& ai' ??? –

+0

исправлено, но такой же результат, никаких ошибок не печатать .. – Salik

+0

Ну, это * должно * работать. Может быть, ваш массив символов не представляет допустимую целую строку. Вы пытались сравнить возвращаемое значение 'atoi' с ожидаемым результатом? –

0

Учитывая ваш дополнительная информация

Сво мультипроцессорные клиент-сервер смоделированы код с помощью сокетов

Вы, вероятно, иметь дополнительную магию в STDOUT_FILENO. Рассмотрите возможность использования fdopen, fprintf, fflush вместо (абсолютно неверно) write и (возможно, неверно) printf.

Как так:

FILE* f = fdopen(STDOUT_FILENO, "w"); 
fprintf(f, "%d", ai); 
fflush(f); 
... 
fclose(f); // also closes the socket 
0
write(STDOUT_FILENO,&ai,sizeof(&ai)); 

пишет bitpattern из ai в stdout, но использует длину адреса ai, а не длина ai. На современных машинах это обычно разные значения 4 по сравнению с 8, поэтому вы пишете произвольный мусор или даже производите ошибку доступа.

Возможно, это не то, что вы хотите.

Если вы хотите написать свой номер в читаемую строку для stdout использования что-то вроде

write(STDOUT_FILENO, math, strlen(math)); 

math уже имеет представление символов, которые вы хотите видеть на stdout.

Если вы действительно хотите, чтобы накачать bitrepresentation из ai там используют

write(STDOUT_FILENO, &ai, sizeof ai); 
Смежные вопросы