Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C STDIN重定向:如何在fgets()读取预期的结束行后使程序结束_C_Arrays_Fgets_Io Redirection - Fatal编程技术网

C STDIN重定向:如何在fgets()读取预期的结束行后使程序结束

C STDIN重定向:如何在fgets()读取预期的结束行后使程序结束,c,arrays,fgets,io-redirection,C,Arrays,Fgets,Io Redirection,好的,我有一个程序可以读取文件的行。但是,一旦到达该行 ***结束*** 这意味着要看到 charstr[100] while(fgets(str,100,stdin)!=NULL和strcmp(str,***END***”) while循环应该停止,因为strcmp将等于0,因此while循环为false 但事实并非如此。我认为这是因为str的字符数与“***END***”的字符数不同(我假设复制行之后的其他字符数没有任何字符)。如何修复程序,使其在读取行时结束?谢谢 好的,我现在知道了,因为

好的,我有一个程序可以读取文件的行。但是,一旦到达该行
***结束***

这意味着要看到
charstr[100]
while(fgets(str,100,stdin)!=NULL和strcmp(str,***END***”)

while循环应该停止,因为strcmp将等于0,因此while循环为false

但事实并非如此。我认为这是因为
str
的字符数与
“***END***”
的字符数不同(我假设复制行之后的其他字符数没有任何字符)。如何修复程序,使其在读取行时结束?谢谢


好的,我现在知道了,因为在我的示例文本中,我在后面有一行。一旦删除,它就可以正常工作。但是,无论后面是否有一行,我如何才能使其结束?

我认为您的输入以一个行尾(
\n
)字符终止<代码>FGET
也将其包含在字符串中

请尝试使用strcmp(str,***END***\n”)。

您可以使用

char * strstr ( const char *, const char * )

指向str2中指定的整个字符序列在str1中第一次出现的指针,或者如果序列在str1中不存在,则为空指针。

可能是因为如果fgets发现很难判断是否有文本源,则会在str数组中附加
\n
符号。请尝试删除文本中
***END***
字符序列后的空行,或将
\n
添加到要与之进行比较的字符串中。如果您是对的。我怎样才能让它工作,不管后面是否有下一行?你可以在他的回答中使用
strstr
比如@user3365834 sugests是的,我知道无论哪种方法都很难知道你想要什么,但是
strstr
也涵盖了
***END***
在其他文本中内联的可能性,比如
这是最后一行***END***
,但是它可能比
strcmp
慢,所以如果
***END***
总是单独出现在一行中,我会使用
strcmp
,但是如果不是这样,你是对的。我怎样才能使它工作,无论后面是否有下一行?一种方法是对
|
使用这两种条件。我试过了,但我认为它不起作用。在while循环中,true是任何非零值。因此,如果
str
不为空,则为真。但是现在当我们看右边,在
&&
之后,我们看到如果我们写
(strcmp(str,***END***”)| | strcmp(str,***END***\n”)
,此时我对while语句的逻辑有点困惑,但是我真的希望你能看到其他的东西,正常情况下,右边是非零值,因为它们不相等。但如果它读取一个或其他条件,则在具有非零值的
| |(或)
中,其中只有一个条件将为0。所有这些都将在带有1的
&(和)
中。因此它将是非零的。。。这是错误的。。。正确的。那它为什么不起作用呢?我想我们需要一个带0的AND。因此,我将在这里放置一个
&
(strcmp(str,***END***>)&&strcmp(str,***END***\n”)