目前我正在读“C - The Programming Language”这本书,我对这个练习有疑问:
“编写一个程序'detab',它将输入中的选项卡替换为适当数量的空格到空格到下一个制表位。假设有一组固定的制表位,比如每个n-colmuns。应该是一个变量或一个符号参数?“
在我写这个程序的练习中放下一个问题:
#include <stdio.h>
#define COLUMNS 5 /* number of columns for a tab */
int main()
{
char c;
int i;
while ((c = getchar()) != EOF) {
if (c == '\t') {
for (i = 0; i < COLUMNS; i++)
putchar(' ');
}
else
putchar(c);
}
return 0;
}
然后我在网上查了解决方案,发现了这个:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_BUFFER 1024
#define SPACE ' '
#define TAB '\t'
int CalculateNumberOfSpaces(int Offset, int TabSize)
{
return TabSize - (Offset % TabSize);
}
/* K&R's getline() function from p29 */
int getline(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;
}
int main(void)
{
char Buffer[MAX_BUFFER];
int TabSize = 5; /* A good test value */
int i, j, k, l;
while(getline(Buffer, MAX_BUFFER) > 0)
{
for(i = 0, l = 0; Buffer[i] != '\0'; i++)
{
if(Buffer[i] == TAB)
{
j = CalculateNumberOfSpaces(l, TabSize);
for(k = 0; k < j; k++)
{
putchar(SPACE);
l++;
}
}
else
{
putchar(Buffer[i]);
l++;
}
}
}
return 0;
}
我现在的问题是我的代码和其他代码之间的区别是什么。 我认为练习会要求每个发生的都应该用n个空格代替。
现在我不知道其他代码是做什么的。
也许我理解练习错了。如果是这样,请向我解释。
感谢您的帮助。
好的,这个解决方案怎么样:
#include <stdio.h>
#define TAB 8 /* size of a tab */
int main()
{
char c;
int i,column = 0;
while ((c = getchar()) != EOF) {
if (c == '\t') {
for (i = column; i < TAB; i++){
putchar(' ');
}
column = -1;
}
else{
putchar(c);
}
column++;
}
return 0;
}
新版本:
#include <stdio.h>
#define TAB 8 /* size of a tab */
int main()
{
char c;
int i,column = 0;
while ((c = getchar()) != EOF) {
if(c == '\n')
column = -1;
if(column >= TAB)
column = 0;
if (c == '\t') {
for (i = column; i < TAB; i++){
putchar(' ');
}
column = -1;
}
else{
putchar(c);
}
column++;
}
return 0;
}
答案 0 :(得分:1)
你弄错了。您必须用空格替换每个选项卡,直到下一个制表符停止。这完全取决于光标的位置。
所以,如果每5列都有一个标签停止,你就可以这样想:
-----|-----|-----|-----|-----|-----|-----|-----|-----|
其中|
是制表位,-
是一个字符。点击标签会转到下一个标签页。因此,例如,如果您从上一个制表位的开头写入3个字符,然后点击制表符,则只需要写2个空格。
答案 1 :(得分:1)
您不希望用相同数量的空格替换每个标签:有些空格会替换为少于空格。
想象一下,我们希望TAB为10个空格
1234567890123456789012345678901234567890
one<TAB> two<TAB> fortytwo four
^^^^^^^ ^^^^^^^ ^^
7 space 7 space 2