C 接受/不接受++;我在一个代码的一部分。K&;R最长线示例
在采用C 接受/不接受++;我在一个代码的一部分。K&;R最长线示例,c,C,在采用i的情况下,程序按预期工作,但在第二种情况下(我认为它应该做同样的工作,这就是我编辑该部分的原因),它不工作。我通过调试器运行它并观察I,在这两种情况下都正确计算并返回了它。但如果不采用++i,程序仍然无法工作。我无法从printf语句中获得打印,而且Ctrl+D在terminal或XTerm(彻底的代码块)中无法工作,我不知道为什么。有什么提示吗?我是否错过了一些合乎逻辑的步骤?以下是完整的代码: if(c=='\n') s[i] = c; ++i;
i
的情况下,程序按预期工作,但在第二种情况下(我认为它应该做同样的工作,这就是我编辑该部分的原因),它不工作。我通过调试器运行它并观察I
,在这两种情况下都正确计算并返回了它。但如果不采用++i
,程序仍然无法工作。我无法从printf
语句中获得打印,而且Ctrl+D在terminal或XTerm(彻底的代码块)中无法工作,我不知道为什么。有什么提示吗?我是否错过了一些合乎逻辑的步骤?以下是完整的代码:
if(c=='\n')
s[i] = c;
++i;
s[i] = '\0'
return 0;
}
//读取行并打印最长行的程序
/*----------------------------------------------------------------------------*/
#包括
#定义MAXLINE 1000
int getline(字符currentline[],int MaxLineLength);
无效副本(char saveto[],char copyfrom[]);
/*----------------------------------------------------------------------------*/
内部主(空)
{
国际长度,最大值;
字符行[MAXLINE],最长[MAXLINE];
max=0;
而((len=getline(line,MAXLINE))>0)
如果(长度>最大值){
max=len;
副本(最长,行);
}
如果(最大值>0)
printf(“StrLength:%d\n字符串:%s”,最大,最长);
返回0;
}
/*----------------------------------------------------------------------------*/
int getline(字符s[],int lim)
{
int c,i;
对于(i=0;i如果不将\n
字符放在当前索引中,则++i
位于if
语句中,因为我们不想增加i
;这将导致在输入的最后一个字符和字符串末尾的\0
之间留下一个索引。ode>++i
位于if
语句中,因为如果不将\n
字符放在当前索引中,我们不想增加i
;这将导致在输入的最后一个字符和字符串末尾的\0
之间留下一个索引。有一个逻辑:
//Program that reads lines and prints the longest
/*----------------------------------------------------------------------------*/
#include <stdio.h>
#define MAXLINE 1000
int getline(char currentline[], int maxlinelenght);
void copy(char saveto[], char copyfrom[]);
/*----------------------------------------------------------------------------*/
int main(void)
{
int len, max;
char line[MAXLINE], longest[MAXLINE];
max = 0;
while( (len = getline(line, MAXLINE)) > 0 )
if(len > max){
max = len;
copy(longest, line);
}
if(max > 0)
printf("StrLength:%d\nString:%s", max, longest);
return 0;
}
/*----------------------------------------------------------------------------*/
int getline(char s[], int lim)
{
int c, i;
for(i=0; i<lim-1 && (c=getchar())!=EOF && c!='\n'; ++i)
s[i] = c;
if(c=='\n'){
s[i] = c;
++i;
}
s[i] = '\0';
return i;
}
/*----------------------------------------------------------------------------*/
void copy(char to[], char from[])
{
int i;
i = 0;
while( (to[i]=from[i]) != '\0')
++i;
}
/*----------------------------------------------------------------------------*/
这意味着仅当您读取一个额外的换行符时,您需要再增加一个
i
,以便为\0
字符保留空间。如果将++i
放在if
块之外。这意味着即使没有换行符输入,它也会始终将i
增加1
,在这种情况下,由于i
在for循环
中已递增,因此\0
已经有空间,因此,++i
将再次出错。您可以打印i
的值并查看其工作原理。有一个逻辑:
//Program that reads lines and prints the longest
/*----------------------------------------------------------------------------*/
#include <stdio.h>
#define MAXLINE 1000
int getline(char currentline[], int maxlinelenght);
void copy(char saveto[], char copyfrom[]);
/*----------------------------------------------------------------------------*/
int main(void)
{
int len, max;
char line[MAXLINE], longest[MAXLINE];
max = 0;
while( (len = getline(line, MAXLINE)) > 0 )
if(len > max){
max = len;
copy(longest, line);
}
if(max > 0)
printf("StrLength:%d\nString:%s", max, longest);
return 0;
}
/*----------------------------------------------------------------------------*/
int getline(char s[], int lim)
{
int c, i;
for(i=0; i<lim-1 && (c=getchar())!=EOF && c!='\n'; ++i)
s[i] = c;
if(c=='\n'){
s[i] = c;
++i;
}
s[i] = '\0';
return i;
}
/*----------------------------------------------------------------------------*/
void copy(char to[], char from[])
{
int i;
i = 0;
while( (to[i]=from[i]) != '\0')
++i;
}
/*----------------------------------------------------------------------------*/
这意味着仅当您读取一个额外的换行符时,您需要再增加一个i
,以便为\0
字符保留空间。如果将++i
放在if
块之外。这意味着即使没有换行符输入,它也会始终将i
增加1
,在这种情况下,由于i
在for循环
中已递增,因此\0
已经有空间,因此,++i
将再次出错。您可以打印i
的值并查看其工作原理。行
if(c=='\n')
相当于
if(c!=EOF)
这有助于解释拥抱发生的原因吗?这句话
if(c=='\n')
相当于
if(c!=EOF)
这有助于解释拥抱发生的原因吗?For循环可能由于3种情况而退出
1.已达到读取字符限制或遇到EOF
2.遇到新线路
对于第一种情况,我们需要将Null存储到字符串s中,因为我指向上次有效字符读取的下一个位置,所以不需要增加i。
但对于第二种情况,当我指向最后一次有效字符读取的下一个位置时,我们现在在该位置存储换行符,然后递增i以存储空字符
这就是为什么我们需要在第二种情况下增加i,而不是在第一种情况下
if(c=='\n'){
s[i] = c;
++i;
}
由于3种情况,For循环可以退出
1.已达到读取字符限制或遇到EOF
2.遇到新线路
对于第一种情况,我们需要将Null存储到字符串s中,因为我指向上次有效字符读取的下一个位置,所以不需要增加i。
但对于第二种情况,当我指向最后一次有效字符读取的下一个位置时,我们现在在该位置存储换行符,然后递增i以存储空字符
这就是为什么我们需要在第二种情况下增加i,而不是在第一种情况下
if(c=='\n'){
s[i] = c;
++i;
}
由i
指定的索引是行没有更多输入时应放置终止null的位置。索引i
之前的位置包含字符串中的最后一个有效字符
请记住,从stdin
读取数据的循环可能会因读取\n
字符以外的原因而终止
如果您有此构造:
if(c=='\n'){
s[i] = c;
++i;
}
然后,如果从stdin
读取的最后一个字符不是换行符,则将索引增加1,而不将任何内容写入i
的预增量值所指定的位置。这将有效地向结果中添加未指定的字符
更糟糕的(?),如果for
循环由于i而终止,则i
指定的索引是当行没有更多输入时应放置终止null的位置。索引i
之前的位置包含字符串中的最后一个有效字符
请记住,从stdin
读取数据的循环可能会因读取\n
字符以外的原因而终止
如果您有此构造:
if(c=='\n'){
s[i] = c;
++i;
}
然后,如果从stdin
读取的最后一个字符不是换行符,则将索引增加一个