为什么putchar在我的选框程序中创建了一个新行?

时间:2016-02-27 20:13:44

标签: c marquee putchar

这是我的代码:

#include <stdio.h>
#include <string.h>

void ignoreRestOfLine(FILE* fp)
{
   int c;
   while ( (c = fgetc(fp)) != EOF && c != '\n');
}


int main( void )
{
    int num_times, count =0;
    int length;
    scanf("%d ", &num_times);
    char s[100];
  for(count=0 ;count<num_times;count++){

    if ( fgets(s, sizeof(s), stdin) == NULL )
    {
       // Deal with error.
    }

    if ( scanf("%d", &length) != 1 )
    {
       // Deal with error.
    }

    ignoreRestOfLine(stdin);

    size_t n = strlen( s );
    size_t m = 5;
    int i,j;
    for (  i = 0; i < strlen(s)+1; i++ ){
        putchar( '[' );
        for (  j = 0; j < m; j++ )
        {
            char c = s[(i + j) % ( n + 1 )];
            if ( !c )
                c = ' ';
            putchar( c );
        }
        printf( "]\n" );
    }


    }
}

第一行是指示我想输入的标志数量。第二行是我输入我希望我的符号输出的字符串。第三行是选框内的空格数。例如:

Input:
1
Hello World!
5

Output:
[Hello]
[ello ]
[llo W]
[lo Wo]
[o Wor]
[ Worl]
[World]
[orld!]
[rld! ]
[ld!  ]
[d!  H]
[!  He]
[Hel ]
[ Hell]

但这是我的代码实际上做的:

Input: 
1
Hello World!
5

Output:
[Hello]
[ello ]
[llo W]
[lo Wo]
[o Wor]
[ Worl]
[World]
[orld!]
[rld!
]
[ld!
 ]
[d!
 H]
[!
 He]
[
 Hel]
[ Hell]

我如何解决这个简单的错误?

2 个答案:

答案 0 :(得分:1)

这是因为你正在从stdin读取换行符。您忽略了输入次数的换行符,但没有忽略字符串输入。你需要从s中删除换行符。 removing-trailing-newline-character-from-fgets-input

答案 1 :(得分:1)

这是因为fgets函数读取整行直到文件结尾或换行符(\n)字符。如果它到达\n,它会在返回之前将它附加到字符串的末尾。如果你不想在你的字符串中使用换行符(在这种情况下你不喜欢),你会想要使用这样的东西去除它:

if (s[strlen(s)-1] == '\n')
  s[strlen(s)-1] = '\0';

这将使用NULL字节替换换行符,将字符串缩短一个字符,并使代码按照您的意图运行。