完整、调整后的代码在帖子末尾
如果我要让用户输入并使用 scanf() 获取它,这个过程是如何工作的(关于缓冲区等的细节)?
当人们提到“刷新”缓冲区时是什么意思?我还听说刷新输入(或者更确切地说,未定义?)是不好的做法,但是刷新输出流是创建 fflush() 之类的函数的目的。-- 上面上下文中的“流”是什么意思?
所以,从程序上讲,如果我要求输入如下:
printf("Enter a string: ");
scanf("%s", string);
输入会发生什么;字符串在哪里被 scanf 函数“抓取”?
输入缓冲区中的“空白”是什么?(空格字符、NULL 等?)
在我看来,虽然我读过的文献从未专门解决过这些问题,但我想来自用户或文件的输入将存储在某个临时 char 数组中,该数组由访问,并使用适当的打印/存储指针。
我提出这个问题的原因是因为我对以下代码有一个相关问题:
int main(){
char string[20];
char string2[20];
//strlen test
printf("Enter a string: ");
scanf("%s", string);
printf("\t length: %d\n", strlen(string));
//strcat test
printf("Enter two strings to concatentate: ");
scanf("%s %s", string, string2);
strcat(string2, string);
printf("\nConcatenated: %s\n\n\n", string);
return 0;
}
顺便说一句:上面的 strlen() 和 strcat() 函数是在本地定义的,因此参数可能与您熟悉的 C 库中的不匹配。
产生以下输出:
我假设,一旦 scanf 函数遇到空格,它就会假定字符串的结尾。虽然,剩余的输入仍然存在于缓冲区中。然后,当我要求更多输入时,输入的数据被放置在缓冲区的末尾。因此,当这次调用 scanf() 时,将“andothernonsensehere”作为下一个输入,因为它较早地存在于缓冲区中。
虽然,如果我上面所说的是真的,第二个“andothernonsensehere”字符串和第二次调用时输入的第一个字符串“sherrell”不应该连接起来吗?
tl; dr verison 如何刷新缓冲区以确保 scanf() 捕获下一个输入事件?
完整,编辑,代码:
#include <stdio.h>
int main(){
char string[20];
char string2[20];
//strlen test
printf("Enter a string: ");
scanf("%s", string);
printf("\t length: %d\n", strlen(string));
clear(); //make sure buffer is empty
//strcat test
printf("Enter two strings to concatentate: ");
scanf("%s %s", string, string2);
strcat(string2, string);
printf("\nConcatenated: %s\n\n\n", string);
return 0;
}
void strcat(char *toCopy, char *org){
while(*org != NULL) org++; //find end of characters
while( (*org++ = *toCopy++) != NULL); //copy
}
int strlen(char *a){
char *b = a;
while(*b++ != NULL);
return b-a;
}
void clear(){
while(getchar() != '\n');
}