【问题标题】:K&R exercise 1-23 remove commentsK&R 练习 1-23 删除评论
【发布时间】:2013-08-04 09:27:05
【问题描述】:

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

这里有两个测试:

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

//不起作用
生成到:
不行

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

#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);
}

【问题讨论】:

标签: c


【解决方案1】:

第一段代码有错别字:

        while(i != '\n'){

应该是

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

第二段代码逻辑稍有错误:

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

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

        while (!(blah blah blah)) {

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

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

【讨论】:

    【解决方案2】:

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

    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]'/'line[i+1]'*'
    2. line [i] 不是'*'line[i+1] 不是'/',所以while 循环开始执行
    3. line[i],即'/',替换为空格
    4. i 递增
    5. line[i] 现在是 '*'(在增量之前曾经是 line[i+1]
    6. while 条件失败,因为line[i] != '*' 为假; line[i] 确实是 '*'
    7. while 循环终止,您将得到 test * test123 ok test */ 作为输出。

    有意义吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-21
      • 2020-06-25
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多