K& R练习1-23删除评论

时间:2013-08-04 09:27:06

标签: c

我坚持这个练习。我无法弄清楚为什么以下代码没有所需的结果。
该程序应该删除评论。在这个程序中,我不考虑字符串和/或字符文字。此外,仅出于测试目的,我在需要删除的点处放置空格而不是NULL。

这是两个测试:

test / * test123 ok test * /
生成:
 test * test123 ok test * /

不工作生成: 没有ork

另外,如果输入太大,我会遇到分段错误

#include <stdio.h>

#define MAXLENGTH 1000

void removec(char code[],int length);

int main()
{
    int i, c;
    char line[MAXLENGTH];


    for(i=0; (c = getchar()) != EOF; i++)
        line[i] = c;

    removec(line, i);
return 0;
}

void removec(char line[], int l)
{
    int i;

    for(i=0; i < l; i++){
        //printf("%c", line[i]);
        if(line[i] == '/' && line[i+1] == '/'){
            while(i != '\n'){
                line[i] = ' ';
                ++i;
            }
        }
        else if(line[i] == '/' && line[i+1] == '*'){
            while((line[i] != '*') && (line[i+1] != '/')){
                line[i] = ' ';
                ++i;
            }
        }

    }
    printf("%s", line);
}

2 个答案:

答案 0 :(得分:2)

第一部分代码有一个拼写错误:

        while(i != '\n'){

应该是

        while(line[i] != '\n'){

第二部分代码的逻辑略有不正确:

        while((line[i] != '*') && (line[i+1] != '/')){

正确的逻辑可以用几种方式正确表达;尝试用以下形式重写它:

        while (!(blah blah blah)) {

其中blah blah blah是您要检查的条件。

请注意,如果评论未终止(例如//后没有换行符号),您的代码将尝试读取输入文件末尾之外的数据(导致输出错误或崩溃)。要解决此问题,请将检查i < l添加到while循环中的所有条件。

答案 1 :(得分:1)

这里有两个不同的问题。这条线

while(i != '\n')

需要

while(line[i] != '\n')

如上所述,你的循环条件将评估i是否等于换行符的十进制值,恰好是10.因此它只会升至line[9],这解释了为什么你得到输出

doesnt ork

与输入一样,line[9]w的{​​{1}}。

对于第二个条件,你有一个逻辑问题:

work

不起作用。这是正在发生的事情。

  1. 其他条件为真:while((line[i] != '*') && (line[i+1] != '/')) line[i]'/'line[i+1]
  2. '*'不是line [i]'*'不是line[i+1],因此'/'循环开始执行
  3. while,即line[i],由空格
  4. 取代
  5. '/'增加
  6. i现在是line[i](在增量之前曾是'*'
  7. line[i+1]条件失败,因为while为false; line[i] != '*'确实是line[i]
  8. '*'循环终止,您留下while作为输出。
  9. 有意义吗?