0

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

这里有两个测试:

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

doesnt //work
生成到:
dont 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);
}
4

2 回答 2

2

第一段代码有错别字:

        while(i != '\n'){

它应该是

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

第二段代码的逻辑有点不正确:

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

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

        while (!(blah blah blah)) {

blah blah blah您要检查的条件在哪里。

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

于 2013-08-04T10:06:33.667 回答
1

你有两个不同的问题在这里发生。线

while(i != '\n')

需要是

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

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

doesnt ork

在输入中,line[9]wwork

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

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

不会工作。这是正在发生的事情。

  1. else 条件为真:line[i]is'/'line[i+1]is '*'
  2. line [i]is not'*'line[i+1]is not '/',所以while循环开始执行
  3. line[i], 即 ,'/'被一个空格代替
  4. i增加
  5. line[i]现在是'*'line[i+1]以前在增量之前)
  6. while条件失败,因为line[i] != '*'是假的;line[i]确实是'*'
  7. while循环终止,你的输出就剩下了test * test123 ok test */

说得通?

于 2013-08-04T10:27:42.857 回答