2016-02-27 19 views
-1

这里是我的代码:为什么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] 

我怎样才能解决这个简单的错误?

+0

从'fgets'描述:“如果读取换行符,则将其存储到缓冲区中”。这应该给你一个线索。 – isedev

+0

由于['fgets'](http://en.cppreference.com/w/c/io/fgets)添加了它在缓冲区中读取的换行符? –

回答

1

这是因为fgets函数读取整行至文件结束或换行(\n)字符。如果它到达\n,它会在返回之前将它追加到字符串的末尾。如果你不想在你的字符串,换行(你在这种情况下没有),你会想用这样的剥离它关闭:

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

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

+0

可能会重复此操作并检查第二次回车。以防万一。 –

相关问题