2016-02-22 2 views
-1
#include <stdio.h> 
#include <string.h> 

int main(void) 
{ 
    //int num_of_signs,x; 
    //scanf("%d", &num_of_signs); 
    //for (x=0; x<num_of_signs; x++){ 
     int num_of_chars, i; 
     char sign[30], two_sign[60]; 
     fgets(sign, sizeof(sign), stdin); 
     scanf("%d", &num_of_chars); 

     sign[strlen(sign) - 1] = '\0'; // discard '\n' 
     strcpy(two_sign, sign); 
     strcat(two_sign, sign); 
     for (i = 0; sign[num_of_chars + i]; i++){ 
     printf("[%.*s]\n", num_of_chars, two_sign + i); 
     } 
    // } 
    return 0; 
} 

Исходный код без цикла делает это:Когда я добавляю цикл for в начало моего кода, моя программа вылетает из строя. Зачем?

Input: 
Hello World! 
5 

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

Когда я добавляю в цикле, чтобы сделать это с несколькими входами, моя программа падает. Чтобы быть конкретным, он падает после ввода первой строки, которую я хочу в качестве своего знака. Я не могу понять, почему ....

То, что я хочу, чтобы это сделать:

Input: 
3 
Hello World! 
5 
Farewell 
10 
Sad 
2 



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

Sign #2: 
[Farewell ] 

Sign #3: 
[Sa] 
[ad] 
[d ] 
[ S] 
+0

Не следует смешивать '' scanf' и fgets'. Либо используйте 'scanf' для всех входных данных (замените' fgets' на 'scanf ("% 29 [^ \ n], знак) '), либо прочитайте строки с' fgets' и извлеките числа с помощью 'sscanf', например' fgets (buffer, sizeof buffer, stdin); sscanf (buffer, "% d", & num_of_chars); ' – user3386109

ответ

4
scanf("%d", &num_of_chars); 

оставляет символ новой строки в потоке. Следовательно, следующий вызов fgets возвращает строку, имеющую только символ новой строки.

Вам нужно добавить код, чтобы игнорировать остальную часть строки после этого.

Добавить функцию

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

и вызвать его сразу после указанной выше scanf линии, как:

ignoreRestOfLine(stdin); 

Кроме того, всегда проверяйте, что вызовы fgets и scanf успеха, прежде чем приступить использовать данные, считаются считанными.

Изменение

fgets(sign, sizeof(sign), stdin); 
    scanf("%d", &num_of_chars); 

в

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

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

    // Skip rest of the line 
    ignoreRestOfLine(stdin); 
+0

Большое вам спасибо. – UcfKnight

Смежные вопросы