我坚持这个练习。我无法弄清楚为什么以下代码没有所需的结果。
该程序应该删除评论。在这个程序中,我不考虑字符串和/或字符文字。此外,仅出于测试目的,我在需要删除的点处放置空格而不是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);
}
答案 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
不起作用。这是正在发生的事情。
while((line[i] != '*') && (line[i+1] != '/'))
为line[i]
,'/'
为line[i+1]
。'*'
不是line [i]
且'*'
不是line[i+1]
,因此'/'
循环开始执行while
,即line[i]
,由空格'/'
增加i
现在是line[i]
(在增量之前曾是'*'
)line[i+1]
条件失败,因为while
为false; line[i] != '*'
确实是line[i]
'*'
循环终止,您留下while
作为输出。有意义吗?