哪些不明显的条件可以决定在提供输入后 getchar 可以访问换行符多长时间?
What unobvious conditions can dictate how long getchar has access to newline characters after input is provided?
我有两个函数都使用 getchar 获取输入。
Example1()
旨在收集输入和 return 值。但是,当连续调用两次时,此函数会注册上一次调用 getchar
时提交的换行符。这对我来说没有意义,因为我认为 getchar
会被限制在 的实际范围内,其中 它被调用,在函数本身结束时结束。
int Example1()
{
printf("Gather input from example1\n");
int user_input;
while ((user_input = getchar()) != '\n')
{
return user_input;
}
return 0;
}
Example2()
收集输入并将其存储在新创建的结构成员中。调用两次时,此函数不会产生与第一个函数相同的问题。
struct foo *Example2()
{
struct foo *user= (struct foo*) malloc(sizeof(struct foo));
printf("Gather input from example2\n");
int user_input
while ((user_input = getchar()) != '\n')
{
user->user_input= user_input;
}
return user;
}
我认为当函数 returns 时 getchar
的实际缓冲区将随着该函数调用的范围而消失。什么会导致换行符在 Example1()
函数中保留在 stdin
缓冲区中,而不是在 Example2()
函数中?
完整代码:
#include<stdlib.h>
#include<stdio.h>
struct foo {
char user_input;
};
struct foo *Example2()
{
struct foo *user= (struct foo*) malloc(sizeof(struct foo));
printf("Gather input from example2\n");
int user_input;
while ((user_input = getchar()) != '\n')
{
user->user_input= user_input;
}
return user;
}
int Example1()
{
printf("Gather input from example1\n");
int user_input;
while ((user_input = getchar()) != '\n')
{
return user_input;
}
return 0;
}
int main()
{
struct foo *user = Example2();
printf("Example 2 function user_input 1/2 : %d\n", user->user_input);
struct foo *user2 = Example2();
printf("Example 2 function user_input 2/2 : %d\n", user2->user_input);
printf("Example 1 function user_input 1/2 : %d\n", Example1());
printf("Example 1 function user_input 2/2 : %d\n", Example1());
}
getchar()
从缓冲区中读取 一个字符。缓冲区依赖于函数作用域。
在你的Example1
函数中,return
语句在调用一次getchar()
后执行(无论读取的字符是否为换行符)。
因此,一次 Example1
调用只读取一个字符,它可能只是一行的一部分。如果 Example1
只读取一行的一部分,则行的左侧部分将由后续调用 getchar()
(或其他 stdin-reading 函数)读取。
另一方面,在您的 Example2
函数中,循环中没有 return
语句,并且 getchar()
一直执行到读取换行符为止。 (即使到达EOF!)因此,Example2
将读取到一行的结尾。
在第一个函数中你没有循环,因为你在它的主体中 return
ing,所以你最多正在读取一个字符。它减少到 if
.
这些函数在任何方面都不等同,差异与范围或使用 struct foo
无关。此外,标准输入流的状态(由 getchar()
使用)对程序来说是全局的。
我有两个函数都使用 getchar 获取输入。
Example1()
旨在收集输入和 return 值。但是,当连续调用两次时,此函数会注册上一次调用 getchar
时提交的换行符。这对我来说没有意义,因为我认为 getchar
会被限制在 的实际范围内,其中 它被调用,在函数本身结束时结束。
int Example1()
{
printf("Gather input from example1\n");
int user_input;
while ((user_input = getchar()) != '\n')
{
return user_input;
}
return 0;
}
Example2()
收集输入并将其存储在新创建的结构成员中。调用两次时,此函数不会产生与第一个函数相同的问题。
struct foo *Example2()
{
struct foo *user= (struct foo*) malloc(sizeof(struct foo));
printf("Gather input from example2\n");
int user_input
while ((user_input = getchar()) != '\n')
{
user->user_input= user_input;
}
return user;
}
我认为当函数 returns 时 getchar
的实际缓冲区将随着该函数调用的范围而消失。什么会导致换行符在 Example1()
函数中保留在 stdin
缓冲区中,而不是在 Example2()
函数中?
完整代码:
#include<stdlib.h>
#include<stdio.h>
struct foo {
char user_input;
};
struct foo *Example2()
{
struct foo *user= (struct foo*) malloc(sizeof(struct foo));
printf("Gather input from example2\n");
int user_input;
while ((user_input = getchar()) != '\n')
{
user->user_input= user_input;
}
return user;
}
int Example1()
{
printf("Gather input from example1\n");
int user_input;
while ((user_input = getchar()) != '\n')
{
return user_input;
}
return 0;
}
int main()
{
struct foo *user = Example2();
printf("Example 2 function user_input 1/2 : %d\n", user->user_input);
struct foo *user2 = Example2();
printf("Example 2 function user_input 2/2 : %d\n", user2->user_input);
printf("Example 1 function user_input 1/2 : %d\n", Example1());
printf("Example 1 function user_input 2/2 : %d\n", Example1());
}
getchar()
从缓冲区中读取 一个字符。缓冲区依赖于函数作用域。
在你的Example1
函数中,return
语句在调用一次getchar()
后执行(无论读取的字符是否为换行符)。
因此,一次 Example1
调用只读取一个字符,它可能只是一行的一部分。如果 Example1
只读取一行的一部分,则行的左侧部分将由后续调用 getchar()
(或其他 stdin-reading 函数)读取。
另一方面,在您的 Example2
函数中,循环中没有 return
语句,并且 getchar()
一直执行到读取换行符为止。 (即使到达EOF!)因此,Example2
将读取到一行的结尾。
在第一个函数中你没有循环,因为你在它的主体中 return
ing,所以你最多正在读取一个字符。它减少到 if
.
这些函数在任何方面都不等同,差异与范围或使用 struct foo
无关。此外,标准输入流的状态(由 getchar()
使用)对程序来说是全局的。