C - 提示输入第二个输入但什么都不做
C - Prompted for a second input and does nothing
下面是我的代码。它做什么不是问题。问题是,一旦它是 运行,我输入我的输入,如果它太小,它会在第二行再次要求输入,这似乎不会影响我的程序流程。如果我填充缓冲区(我假设 100 或更多),那么我不会被要求第二次提示。
#include <stdio.h>
#include <string.h>
int main()
{
int ch;
char x[3];
char *word, string1[100];
x[0]='y';
while(x[0]=='y'||x[0]=='Y')
{
fgets(string1, 100, stdin);
while ( (ch = fgetc(stdin)) != EOF && ch != '\n');
printf("The string is: %s", string1);
word = strtok(string1, " ");
while(word != NULL)
{
printf("%s\n", word);
word = strtok(NULL, " ");
}
printf("Run Again?(y/n):");
fgets(x, 2, stdin);
while ( (ch = fgetc(stdin)) != EOF && ch != '\n');
}
return 0;
}
编辑:
我已经替换了,
fgets(string1, 100, stdin);
while ( (ch = fgetc(stdin)) != EOF && ch != '\n');
有,
fgets(string1, 100, stdin);
if (string1[98] != '\n' && string1[99] == '[=12=]')
{
while ( (ch = fgetc(stdin)) != EOF && ch != '\n');
}
您的问题的答案就在这里:man fgets
fgets()
reads in at most one less than size
characters from stream
and stores them into the buffer pointed to by s
. Reading stops after an EOF or a newline. If a newline is read, it is stored into the buffer. A terminating null byte ('[=16=]'
) is stored after the last character in the buffer.
要知道 fgets
是否使用了整个缓冲区,请将一些非 NUL 字节写入缓冲区的末尾。如果在调用 fgets
之后,该字节已被 NUL 覆盖,则表示缓冲区已满。如果它之前的字符不是换行符,那么还有更多的输入需要读取。
buffer[size - 1] = 'a'; // any character that's not '[=10=]'
fgets(buffer, size, stdin);
if (buffer[size - 1] == '[=10=]' && buffer[size - 2] == '\n') {
// handle extra input
}
或者,您可以使用 getchar
.
一次读取一个字节
我想你需要这个:
注意:如果要与 EOF
进行比较,x
必须是 int
int main()
{
int x;
char *word, string1[100];
do
{
fgets(string1, 100, stdin);
printf("The string is: %s", string1);
word = strtok(string1, " ");
while(word != NULL)
{
printf("%s\n", word);
word = strtok(NULL, " ");
}
printf("Run Again?(y/n):");
x = fgetc(stdin);
fgetc(stdin); // absorb `\n`
}
while( (x=='y'||x=='Y') && x != EOF) ;
return 0;
}
来自手册页:
fgets() reads in at most one less than size characters from stream and stores them into the buffer pointed to by s. Reading stops
after an EOF or a newline. If a newline is read, it is stored into the buffer. A terminating null byte ('[=10=]') is stored after the
last character in the buffer.
fgets
会将所有输入(最多 99 chars
)放入 string1。如果您输入 98 个字符并按回车键(创建第 99 个 \n
),那么所有 100 个字符都将被使用,因为最后一个字符是 [=14=]
终止符。
然后你会陷入那个 while
小循环,这个循环除了消耗另一行输入外什么都不做。如果您输入的字符串小于最大值,则在该循环等待 \n
.
时停止输入
如果您输入 >98 个字符,那么前 99 个字符将保存到您的输入字符串中,其余的 \n
将立即 运行 通过 while 循环,从而使其退出速度足够快,以至于它似乎被跳过了。
希望对您有所帮助。不幸的是,我无法发表评论并要求澄清,所以我会在这里说,很难说出你到底想要修复或澄清什么。
下面是我的代码。它做什么不是问题。问题是,一旦它是 运行,我输入我的输入,如果它太小,它会在第二行再次要求输入,这似乎不会影响我的程序流程。如果我填充缓冲区(我假设 100 或更多),那么我不会被要求第二次提示。
#include <stdio.h>
#include <string.h>
int main()
{
int ch;
char x[3];
char *word, string1[100];
x[0]='y';
while(x[0]=='y'||x[0]=='Y')
{
fgets(string1, 100, stdin);
while ( (ch = fgetc(stdin)) != EOF && ch != '\n');
printf("The string is: %s", string1);
word = strtok(string1, " ");
while(word != NULL)
{
printf("%s\n", word);
word = strtok(NULL, " ");
}
printf("Run Again?(y/n):");
fgets(x, 2, stdin);
while ( (ch = fgetc(stdin)) != EOF && ch != '\n');
}
return 0;
}
编辑: 我已经替换了,
fgets(string1, 100, stdin);
while ( (ch = fgetc(stdin)) != EOF && ch != '\n');
有,
fgets(string1, 100, stdin);
if (string1[98] != '\n' && string1[99] == '[=12=]')
{
while ( (ch = fgetc(stdin)) != EOF && ch != '\n');
}
您的问题的答案就在这里:man fgets
fgets()
reads in at most one less thansize
characters fromstream
and stores them into the buffer pointed to bys
. Reading stops after an EOF or a newline. If a newline is read, it is stored into the buffer. A terminating null byte ('[=16=]'
) is stored after the last character in the buffer.
要知道 fgets
是否使用了整个缓冲区,请将一些非 NUL 字节写入缓冲区的末尾。如果在调用 fgets
之后,该字节已被 NUL 覆盖,则表示缓冲区已满。如果它之前的字符不是换行符,那么还有更多的输入需要读取。
buffer[size - 1] = 'a'; // any character that's not '[=10=]'
fgets(buffer, size, stdin);
if (buffer[size - 1] == '[=10=]' && buffer[size - 2] == '\n') {
// handle extra input
}
或者,您可以使用 getchar
.
我想你需要这个:
注意:如果要与 EOF
x
必须是 int
int main()
{
int x;
char *word, string1[100];
do
{
fgets(string1, 100, stdin);
printf("The string is: %s", string1);
word = strtok(string1, " ");
while(word != NULL)
{
printf("%s\n", word);
word = strtok(NULL, " ");
}
printf("Run Again?(y/n):");
x = fgetc(stdin);
fgetc(stdin); // absorb `\n`
}
while( (x=='y'||x=='Y') && x != EOF) ;
return 0;
}
来自手册页:
fgets() reads in at most one less than size characters from stream and stores them into the buffer pointed to by s. Reading stops
after an EOF or a newline. If a newline is read, it is stored into the buffer. A terminating null byte ('[=10=]') is stored after the
last character in the buffer.
fgets
会将所有输入(最多 99 chars
)放入 string1。如果您输入 98 个字符并按回车键(创建第 99 个 \n
),那么所有 100 个字符都将被使用,因为最后一个字符是 [=14=]
终止符。
然后你会陷入那个 while
小循环,这个循环除了消耗另一行输入外什么都不做。如果您输入的字符串小于最大值,则在该循环等待 \n
.
如果您输入 >98 个字符,那么前 99 个字符将保存到您的输入字符串中,其余的 \n
将立即 运行 通过 while 循环,从而使其退出速度足够快,以至于它似乎被跳过了。
希望对您有所帮助。不幸的是,我无法发表评论并要求澄清,所以我会在这里说,很难说出你到底想要修复或澄清什么。