gpt4 book ai didi

C Linux - fgets 的输入导致无限循环

转载 作者:行者123 更新时间:2023-11-30 21:03:41 27 4
gpt4 key购买 nike

我有一个奇怪的问题。我在 Linux 上使用 C。

我正在尝试使用 fgets 从 stdin 获取输入。

它工作正常,但是当我输入如下字符串时:

x^2,1,2(然后输入)

x^2+x^1,1,2(然后输入)

它的表现就像 fgets 仍在工作,但它没有完成该操作。

我尝试在 fgets 之后打印一些内容,但代码没有到达该行,它只是保留在 fgets 中!

如果我输入:

x^2+1,1,2

x^2+x^1+2,1,2

它有效!!

我认为这可能与最后的^1 ^2有关...我不知道发生了什么

代码:

char* ReadInputIntegral(FILE *stream)
{
int i; //assistent variable

//allocate 'input' in size of LEN(=512)
char *input = (char*)malloc(sizeof(char)*LEN);

//in case allocation failed
if(input==NULL)
{
return NULL;
}

//put the user input from command line to 'input'
if( fgets (input , LEN , stream) == NULL )
{

//in case error during reading from standard input
free(input);
return NULL;
}

// case of user insert empty command
if(input[0]=='\n' || input[0]=='\0')
{
printf("INPUT:2");
free(input);
return NULL;
}

//replace the '\n' in the end of input command to '\0'.
for(i=0; input[i]!='\n'; i++);
input[i]='\0';

return input;
}

最佳答案

我无法重现任何与您描述的问题类似的问题:

#include <stdio.h>
#include <stdlib.h>

#define LEN 512

char* ReadInputIntegral(FILE *stream)
{
int i; //assistent variable

//allocate 'input' in size of LEN(=512)
char *input = (char*)malloc(sizeof(char)*LEN);

//in case allocation failed
if(input==NULL)
{
return NULL;
}

//put the user input from command line to 'input'
if( fgets (input , LEN , stream) == NULL )
{

//in case error during reading from standard input
free(input);
return NULL;
}

// case of user insert empty command
if(input[0]=='\n' || input[0]=='\0')
{
printf("INPUT:2");
free(input);
return NULL;
}

//replace the '\n' in the end of input command to '\0'.
for(i=0; input[i]!='\n'; i++);
input[i]='\0';

return input;
}

int main(void) {
char * input = ReadInputIntegral(stdin);
printf("Input is: %s\n", input);
return 0;
}

给出:

paul@MacBook:~/Documents/src$ ./integral
hi there
Input is: hi there
paul@MacBook:~/Documents/src$ ./integral
x^2, 1, 2
Input is: x^2, 1, 2
paul@MacBook:~/Documents/src$ ./integral
x^2+x^1,1,2
Input is: x^2+x^1,1,2
paul@MacBook:~/Documents/src$

在 Debian Linux 系统上编译并运行会得到相同的结果。

至于“无限循环”,您的代码摘录中只有一个循环。如果输入超过缓冲区的长度,这可能会变得困惑,因为 fgets() 将不包含 '\n',但您断言缓冲区长度为 512,因此您尝试的任何输入都不会出现问题。

关于不强制转换 malloc() 返回值以及不使用 sizeof(char) 的强制注释一如既往地适用。

关于C Linux - fgets 的输入导致无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23298427/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com