2012-05-09 20 views
6

Estoy empezando con C y estaba probando algunos ejemplos del libro de Ritchie. Escribí un pequeño programa para entender las matrices de caracteres, pero topé con algunos errores, y esperaba una idea de lo que yo he entendido mal:Programación C principiante - Explique este error

#include <stdio.h> 
#define ARRAYSIZE 50 
#include <string.h> 

main() { 
    int c,i; 
    char letter[ARRAYSIZE]; 
    i=0; 
    while ((c=getchar()) != EOF) 
    {  
    letter[i]=c; 
    i++; 
    } 
    letter[i]='\0'; 
    printf("You entered %d characters\n",i); 
    printf("The word is "); 

    printf("%s\n",letter); 
    printf("The length of string is %d",strlen(letter)); 
    printf("Splitting the string into chars..\n"); 
    int j=0; 
    for (j=0;j++;(j<=strlen(letter))) 
    printf("The letter is %d\n",letter[j]); 
} 

La salida es:

$ ./a.out 
hello how are youYou entered 17 characters 
The word is hello how are you 
The length of string is 17Splitting the string into chars.. 

¿Cuál es ¿sucediendo? ¿Por qué el ciclo for no da ningún resultado?

Respuesta

11

La sintaxis debería ser;

for (j=0; j<strlen(letter); j++) 

Desde strlen es la operación costy, y cuando no modifique la cadena dentro del bucle, es mejor escribir como:

const int len = strlen(letter); 
for (j=0; j<=len; j++) 

Además, es recommanded fuertemente comprobar siempre para el desbordamiento de búfer cuando trabajar con C-cuerdas y entrada de usuario:

while ((c=getchar()) != EOF && i < ARRAYSIZE - 1) 
+1

+1 para recomendar verificación de matriz vinculada –

+0

Gracias por ese consejo también. Agregaré verificaciones de errores pronto. Pensé en aclarar lo básico. ¡Mira cómo me equivoqué incluso en la sintaxis de for! :) – Droidzone

7

el error está en el para, sólo cambiar la condición de finalización y el incremento de la siguiente manera:

for (j = 0; j <= strlen(letter); j++) 

Pregunta: ¿qué es eso último carácter?

+0

'j

+0

@ another.anon.coward: por supuesto, pero creo que ver el terminador nulo es beneficioso para el op – BlackBear

+0

¡Supongo que tienes razón! ^^ –

3

El formato correcto de for bucle es:

for (initialization_expression; loop_condition; increment_expression){ 
    // statements 
} 

por lo que su bucle for debe ser

for (j = 0; j < strlen(letter); j++) 
4

for (j=0;j++;(j<=strlen(letter))) no es correcta.

Debe ser for (j=0; j<=strlen(letter); j++) - incrementar en la tercera posición.

2

En el ciclo for, la condición es i ++, que se evalúa como falso (0) la primera vez. Necesita intercambiarlos: for (j=0; j <= strlen(letter); j++)

+0

+1: solo responde aquí hasta ahora, lo que intenta explicar por qué los bucles no imprimen ninguna salida –

Cuestiones relacionadas