Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.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 接受/不接受++;我在一个代码的一部分。K&;R最长线示例_C - Fatal编程技术网

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
读取的最后一个字符不是换行符,则将索引增加一个