El valor devuelto por atoi no se puede imprimir

Antes de presentar el código, un poco de información: tengo una matriz de punteros de caracteres con el nombre math, ahora, en el while bucle Estoy tratando de convertir el valor en matemáticas a un int usar atoi y guardarlo en un int variable ai. No hay errores de compilación. Sin embargo, cuando intento imprimir ai no lo esta imprimiendo. De alguna manera, el programa se ejecuta sin fallar. No puedo entender cuál es el problema y si hay un problema, el programa debería fallar atoi y si no hay problema, entonces debería imprimirse ai.

El código es el siguiente:

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++;
}

preguntado el 12 de junio de 12 a las 18:06

¿Qué es "matemáticas [c2]"? ¿Cómo se define? -

es c2++; en la penúltima línea, perdón por el error tipográfico. -

math[c2] es una matriz de punteros de caracteres y se define como: char *math[10]; -

al leer sobre la "rutina de escritura", toma una cadena de caracteres, por lo tanto, si math es una cadena, entonces math[c2] será un carácter. La salida de atoi será un número entero. Write no toma números enteros. está tratando de usar la "referencia a" ai, no ai en sí.

he probado con printf("%d",&ai); esto tampoco funciona. -

3 Respuestas

Recuerda que write no está printf. Así que,

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

escribirá sizeof(int) piezas de caracteres, a STDOUT; si asumimos un 32-bit int, imprimirá los caracteres correspondientes en la tabla de códigos ASCII a (ai >> 24) & ff, (ai >> 16) & ff, (ai >> 8) & ff y (ai >> 0) & ff, que posiblemente son cuatro caracteres no imprimibles.

Si desea escribir la representación de cadena del entero en la consola, use:

printf("%d", ai);

preferiblemente.

Respondido el 12 de junio de 12 a las 18:06

Bien que debe: trabajo. Tal vez su matriz de caracteres no represente una cadena entera válida. ¿Intentó comparar el valor de retorno de atoi al resultado esperado? - usuario529758

la comprobación no parece funcionar. Comparé: if(ai==1){//que debería estar en la primera iteración printf("%d",1);} else{ printf("%d",0) ; } pero tampoco imprime 0 o 1 en ningún momento. - Salik

y está ejecutando perfectamente el resto del código en el mismo bucle. - Salik

Tiene serios problemas con su código si ninguno rama de la if está ejecutando. Exactamente uno de ellos, ya sea la parte if o else debe ejecutarse. - usuario529758

"¡Como mi señor siempre decía, printf no es confiable!" ahora solo estás bromeando, ¿verdad? - usuario529758

Teniendo en cuenta su información adicional

es un código modelado de servidor cliente multiprocesado usando sockets

Probablemente tengas algo de magia adicional en STDOUT_FILENO. Considere usar fdopen, fprintf, fflush en lugar de (absolutamente incorrecto) write y (posiblemente incorrecto) printf.

Al igual que:

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

Respondido el 12 de junio de 12 a las 19:06

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

escribe el patrón de bits de ai a stdout pero utiliza la longitud de la dirección de ai y no la longitud de ai. En las máquinas modernas, estos suelen ser valores diferentes. 4 frente a 8, por lo que está escribiendo basura arbitraria o incluso produce un error de acceso.

Esto probablemente no es lo que quieres, de todos modos.

Si desea escribir su número como una cadena legible para stdout usa algo como

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

math ya tiene la representación del personaje que desea ver en stdout.

Si realmente quiere bombear la representación de bits de ai por ahí uso

write(STDOUT_FILENO, &ai, sizeof ai);

Respondido el 12 de junio de 12 a las 20:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.