如果我打开输入这样的句子" 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);
}
答案 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;在输入中,该空间在输入中,将被消耗。
这包括标签,空格,换行符。