if (c == '\r');

jinandsun 2003-05-04 07:38:29
if (c == '\r');
这个语句的用意是?
...全文
109 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
jinandsun 2003-05-04
  • 打赏
  • 举报
回复
明白了,谢谢:)
lifanxi 2003-05-04
  • 打赏
  • 举报
回复
if(*prog == '\r') { //读到\r了,表示遇到回车换行了
++prog; //\r后肯定是\n,不要了
++prog; //指到下一个字符,继续分析。
while(iswhite(*prog) && *prog) ++prog;
}
jinandsun 2003-05-04
  • 打赏
  • 举报
回复
不太明白,为什么要过滤回车呢
而且还是2次?
jinandsun 2003-05-04
  • 打赏
  • 举报
回复
lifanxi 2003-05-04
  • 打赏
  • 举报
回复
里面好像没有什么都不做的if (c == '\r');吧,它找到了\r都是要做相应处理的。
                   ^这里的分号是表示空语句。
这里就没有过滤多余\r的意思了,好像就是指遇到回车就做相应的处理。
if(*prog == '\r') {
++prog;
++prog;
while(iswhite(*prog) && *prog) ++prog;
}
这段中两次++prog,好像是用于过滤过余的\n。
我前面的两次回复作废,以这次为准。

jinandsun 2003-05-04
  • 打赏
  • 举报
回复
listing 1
/* Get a token. */
int get_token(void)
{/*得到一个单词*/

register char *temp;
/*register char *temp指针类型的缓冲*/?
token_type = 0; tok = 0;
/*token_type 定义一个字符类型存放符号类型*/

temp = token;
*temp = '\0';

/* skip over white space */
/*跳过空白*/
while(iswhite(*prog) && *prog) ++prog;
/* *prog指针是指象当前正在读取字符*/
if(*prog == '\r') {
++prog;
++prog;
while(iswhite(*prog) && *prog) ++prog;
}

if(*prog == '\0') { /* end of file */
*token = '\0';
tok = FINISHED;
return (token_type = DELIMITER);
}

if(strchr("{}", *prog)) { /* block delimiters */
*temp = *prog;
temp++;
*temp = '\0';
prog++;
return (token_type = BLOCK);
}

/* look for comments */
if(*prog == '/')
if(*(prog+1) == '*') { /* is a comment */
prog += 2;
do { /* find end of comment */
while(*prog != '*') prog++;
prog++;
} while (*prog != '/');
prog++;
}

if(strchr("!<>=", *prog)) { /* is or might be
a relational operator */
switch(*prog) {
case '=': if(*(prog+1) == '=') {
prog++; prog++;
*temp = EQ;
temp++; *temp = EQ; temp++;
*temp = '\0';
}
break;
case '!': if(*(prog+1) == '=') {
prog++; prog++;
*temp = NE;
temp++; *temp = NE; temp++;
*temp = '\0';
}
break;
case '<': if(*(prog+1) == '=') {
prog++; prog++;
*temp = LE; temp++; *temp = LE;
}
else {
prog++;
*temp = LT;
}
temp++;
*temp = '\0';
break;
case '>': if(*(prog+1) == '=') {
prog++; prog++;
*temp = GE; temp++; *temp = GE;
}
else {
prog++;
*temp = GT;
}
temp++;
*temp = '\0';
break;
}
if(*token) return (token_type = DELIMITER);
}

if(strchr("+-*^/%=;(),'", *prog)){ /* delimiter */
*temp = *prog;
prog++; /* advance to next position */
temp++;
*temp = '\0';
return (token_type = DELIMITER);
}

if(*prog=='"') { /* quoted string */
prog++;
while(*prog != '"'&& *prog != '\r') *temp++ = *prog++;
if(*prog == '\r') sntx_err(SYNTAX);
prog++; *temp = '\0';
return (token_type = STRING);
}

if(isdigit(*prog)) { /* number */
while(!isdelim(*prog)) *temp++ = *prog++;
*temp = '\0';
return (token_type = NUMBER);
}

if(isalpha(*prog)) { /* var or command */
while(!isdelim(*prog)) *temp++ = *prog++;
token_type = TEMP;
}

*temp = '\0';

/* see if a string is a command or a variable */
if(token_type==TEMP) {
tok = look_up(token); /* convert to internal rep */
if(tok) token_type = KEYWORD; /* is a keyword */
else token_type = IDENTIFIER;
}
return token_type;
}

这个是原程序

为什么要过滤多余的'\r'呢?
lifanxi 2003-05-04
  • 打赏
  • 举报
回复
因为在Win32平台下换行是由\r\n两个字符完成的,在UNIX下好像是只用\n的,所以要过滤掉\r。记不清了。
lifanxi 2003-05-04
  • 打赏
  • 举报
回复
如果c等于\r(回车)的话,什么也不做。可能是用来过滤多余的\r吧。

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧