2017-01-02 2 views
0

то, что я пытаюсь сделать, это создать цикл, который собирает строку (в данном случае это имя), а затем задает вопрос пользователю по запросу персонажа, хочет ли он продолжайте вставлять больше.Невозможно создать правильный цикл сбора данных - C

#include <stdio.h> 
#include <string.h> 
void main(){ 
    char c, str[5][20]; 
    int i=0; 
    do { 
     printf("What's your name?\n"); 
     gets(str[i]); 
     i++; 
     printf("Do you want to insert more?\n"); 
     scanf("%c\n",&c); 
    } while (c=='y'); 
} 

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

+0

Пожалуйста, опишите текущее поведение вашей программы, включая то, что неправильно/отсутствующее поведение у него есть. Но да, это определенно возможно сделать то, что вы хотите. Общий подход - выбрать MAX_LENGTH для каждой строки и использовать динамическое распределение памяти для каждого имени. – kaylum

+1

Пожалуйста, не используйте 'gets'. Он подвержен многим проблемам, включая безопасность. Вместо этого попробуйте использовать 'fgets'. – MateoConLechuga

+0

В чем ваш вопрос? – melpomene

ответ

-3

Это становится легче, при повороте вокруг: вместо того, чтобы просить больше, ждать пустого ввода

#include <stdio.h> 
#include <string.h> 
void main(){ 
     char c, str[5][20]; 
     int i=0; 
     do { 
      printf("What's your name? - (end list with empty string)\n"); 
      gets(str[i]); 
      i++; 
     } while (len(str[i-1] > 0) && (i < 5)); 
    } 
+1

Ugh. ' get' может переполняться. Что такое 'len'? – DevNull

-3

Вы могли бы сделать это таким образом.

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

int main() { 
    char c[3], str[5][20]; 
    int i = 0; 
    do { 
     printf("What's your name?\n"); 
     if (fgets(str[i], sizeof str[i], stdin)) { 
      // input has worked, do something with data 
      i++; 
     } 
     printf("Do you want to insert more?\n"); 
     if (fgets(c, 3, stdin)) { 
      // input has worked, do something with data 
     } 
    } while (c[0] == 'y'); 
} 

Тест

What's your name? 
Mallory 
Do you want to insert more? 
y 
What's your name? 
Carol 
Do you want to insert more? 
no 

Process finished with exit code 0 
+0

, а' sizeof & c' задает размер указателя, а не размер 'char', что также может привести к переполнению буфера. – kaylum

+0

Это пытается использовать целое число как адрес буфера. – melpomene