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”)