2016-02-27 29 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

可能會重複此操作並檢查第二次回車。以防萬一。 –

相關問題