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;
}
この例は、C に関する K&R の本、配列に関する 1.9 章からのものです。私が理解していないのは、なぜ++i
内部if
声明を受け入れなければならないのですか? それを外側に書いても同じ仕事をするはずです。
if(c=='\n')
s[i] = c;
++i;
s[i] = '\0'
return 0;
}
プログラムを受け入れる場合はi
意図したとおりに動作しますが、2番目のケース(私の意見では同じ動作をするはずであり、これがその部分を編集した理由です)では動作しません。デバッガーで実行しi
、どちらの場合も正しく計算されて返されることを確認しました。しかし、プログラムは を受け入れないと機能しません++i
。print fromprintf
ステートメントが表示されず、ターミナルまたは XTerm (CodeBlocks を使用) で Ctrl+D が機能しません。理由がわかりません。ヒントをお願いします。論理的なステップが欠けていますか?完全なコードは次のとおりです。
//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;
}
/*----------------------------------------------------------------------------*/