我应该编写一个简单的程序来删除它们的尾随空格和制表符。它应该用C中最基本的工具编写(无指针和库)。
/* Write a program to remove trailing blanks and tabs from each
line of input, and to delete entirely blank lines. */
#include <stdio.h>
#define MAXLINE 1000
int gettline(char s[], int lim);
void inspect_line(char s[], int limit, int start, int end);
main()
{
int len, i, start, end;
start = 0;
end = MAXLINE;
char line[MAXLINE];
while ((len = gettline(line, MAXLINE)) > 0){
inspect_line(line, MAXLINE, start, end);
for(i=start; i<end-1;++i)
printf("%c",line[i]);
}
printf("\n");
return 0;
}
/* gettline: read a line into s, return length */
int gettline(char s[], int lim)
{
int c, i;
for (i=0; i<lim-1 && (c=getchar())!=EOF && c!='\n'; ++i)
s[i] = c;
if (c == '\n'){
s[i] = c;
++i;
}
s[i] = '\0';
return i;
}
/* inspect_line: determines the indices to the start and the end of the sentence */
void inspect_line(char s[], int limit, int start, int end)
{
while((s[start]!=' ') && (start<limit-1))
++start;
while(!(s[end]>=33 && s[end]<=126))
--end;
}
当我运行它时,我得到一个奇怪的结果:
我不确定问题是什么,我一直试图调试它几个小时没有结果。
答案 0 :(得分:2)
这是发生了什么:当你写
inspect_line(line, MAXLINE, start, end);
for(i=start; i<end-1;++i)
printf("%c",line[i]);
您认为start
函数中设置为end
和inspect_line
的值将转移到main
;那个假设是不正确的。在C中,参数按值传递。这就是start
和end
保持呼叫前的原因。
您可以通过将指向start
和end
的指针传递到inspect_line
函数来解决此问题。当然,您还需要将函数更改为接受和使用指针:
void inspect_line(char s[], int *start, int *end)
{
while(isspace(s[*start]) && (*start < *end))
++(*start);
while(isspace(s[*end]) && (*start < *end))
--(*end);
}
电话会是这样的:
// Note that passing MAXLINE is no longer necessary
inspect_line(line, &start, &end);
for(i=start ; i <= end-1 ; ++i) // both start and end are inclusive
printf("%c",line[i]);
您还需要在循环的每次迭代之间重新初始化start
和end
,将start
设置为零,将end
设置为当前值{{ 1}}。