cfor-loopcharscanfconversion-specifier

taking char. by char. input to make a string in c


so i did try it with using a for loop but every single time my output skips the value of index 0 and i just dont understand why.... here is my code :

// take char by char input and print it as string

#include <stdio.h>

void input(){
    printf("this program takes char by char input for string\n");
    int length;
    printf("provide us with the total length of the string : ");
    scanf("%d",&length);
    char arr[length];
    char placeholder;
    for(int i=0;i<length;i++){
        if(i==length){
             arr[i]='\0';
        }
        printf("input char[%d] : ",i);
        scanf("%c",&placeholder);
        printf("\n");
        arr[i]=placeholder;
        }
}

int main(){
    input();
}

the output im getting : this program takes char by char input for string provide us with the total length of the string : 10 input char[0] : // it got skipped
input char[1] : // this is where i can enter value


Solution

  • For starters this if statement within the for loop

    for(int i=0;i<length;i++){
        if(i==length){
             arr[i]='\0';
        }
        //...
    

    is never executed due to the condition of the for loop. Moreover in any case this if statement is invalid because the valid range of indices for the array is [0, length). That is using an index equal to the value of length results in overwritting memory outside the array.

    Secondly this call of scanf

    scanf("%c",&placeholder);
    

    reads also the new line character '\n' that stored in the input buffer after pressing the Enter key.

    To skip white space characters including the new line character '\n' you should use the following conversion specification

    scanf(" %c",&placeholder);
       
    

    Pay attention to the leading space in the format string.

    Also bear in mind that you should check whether the value of the variable length was inputed and whether it is gretaer than zero. For example something like

    if ( scanf("%d",&length) == 1 && length > 0 )
    {
       char arr[length];
       //...
    }
    else
    {
       //...
    }
    

    Though in any case it would be better to declare the variable length as having an unsigned integer type (unsigned int or size_t) instead of the signed integer type int.