Vladimir Djukic
Vladimir Djukic

Reputation: 2072

Why if I enter sentence other scanf is skipped

If I open enter sentence something like this "asdasd asd asdas sad" for any char scanf it will skip other scanfs.

for exapmle if I type for obligation scanf this sentence it will write for obligation scanf this and next scanf will be skipped but automaticly will be field with sentence word...

Here is the code:

while(cont == 1){
    struct timeval tv;
    char str[12];
    struct tm *tm;

    int days = 1;
    char obligation[1500];
    char dodatno[1500];

    printf("Enter number of days till obligation: ");
    scanf(" %d", &days);
    printf("Enter obligation: ");
    scanf(" %s", obligation);
    printf("Sati: ");
    scanf(" %s", dodatno);

    if (gettimeofday(&tv, NULL) == -1)
        return -1; /* error occurred */
    tv.tv_sec += days * 24 * 3600; /* add 6 days converted to seconds */
    tm = localtime(&tv.tv_sec);
    /* Format as you want */

    strftime(str, sizeof(str), "%d-%b-%Y", tm);

    FILE * database;
    database = fopen("database", "a+");
    fprintf(database, "%s|%s|%s \n",str,obligation,dodatno);
    fclose(database);

    puts("To finish with adding enter 0 to continue press 1 \n");
    scanf(" %d", &cont);
    }

Upvotes: 0

Views: 178

Answers (3)

Lukas
Lukas

Reputation: 3433

I recommend reading character by character. you can use the following function e.g.

//reads user input to an array
void readString(char *array, char * prompt, int size) {
    printf("%s", prompt);
    char c; int count=0;
    while ( getchar() != '\n' );
    while ((c = getchar()) != '\n') {
        array[count] = c; count++;
        if (size < count){ break; } //lets u reserve the last index for '\0'
    }
}
//in your main you can simply call this as 
readString(obligation, "Enter obligation", 1500);

Upvotes: 1

user3629249
user3629249

Reputation: 16540

Each successive call to scanf() can have a leading space in the format string.

When the format string contains a space, any 'white space' in the input, where that space is in the input, will be consumed.

This includes tabs, spaces, newlines.

Upvotes: -1

Spikatrix
Spikatrix

Reputation: 20244

%s stops scanning when it encounters a whitespace character (space, newline etc). Use the %[ format specifier instead :

scanf(" %[^\n]", obligation);
scanf(" %[^\n]", dodatno);

%[^\n] tells scanf to scan everything until a newline character. It is better to use the length modifier which limits the number of characters to read:

scanf(" %1499[^\n]", obligation);
scanf(" %1499[^\n]", dodatno);

In this case, it will scan a maximum of 1499 characters (+1 for the NUL-terminator at the end). This prevents buffer overruns. You can also check the return value of scanf as @EdHeal suggests in a comment to check if it was successful.

Upvotes: 2

Related Questions