为什么我输入句子跳过其他scanf

时间:2015-06-28 11:56:54

标签: c scanf

如果我打开输入这样的句子" asdasd asd asdas sad"对于任何char scanf,它将跳过其他scanfs。

如果我输入obligation scanf this sentence,它将为obligation scanf写入此内容,并且将跳过下一个scanf,但会自动显示sentence word字段...

以下是代码:

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

3 个答案:

答案 0 :(得分:2)

%s在遇到whitespace character(空格,换行符等)时停止扫描。请改用%[格式说明符:

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

%[^\n]告诉scanf扫描所有内容,直到换行符。最好使用长度修饰符来限制要读取的字符数:

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

在这种情况下,它将扫描最多1499个字符(结尾处的NUL终止符为+1)。这会阻止buffer overruns。您还可以将scanf的返回值检查为@EdHeal suggests in a comment,以检查其是否成功。

答案 1 :(得分:1)

我建议逐字逐句阅读。你可以使用以下功能,例如

//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);

答案 2 :(得分:-1)

每次连续调用scanf()都可以在格式字符串中有一个前导空格。

当格​​式字符串包含空格时,任何&#39;空格&#39;在输入中,该空间在输入中,将被消耗。

这包括标签,空格,换行符。