2017-01-25 7 views
2

Итак, я знаю, что этот вопрос задан раньше, но я не могу заставить ничего работать. То, что я сейчас не в этом:Сканирование пробела/всей строки в c

#include<stdio.h> 

struct ClothingCustomer{ 
    char name[20]; 
    int age; 
    double inseam; 
}; 

struct ClothingCustomer createACustomer(){ 
    struct ClothingCustomer aCustomer; 

    printf("Enter Customer Name: "); 
    scanf("%s",aCustomer.name); 

    printf("Age: "); 
    scanf("%d",&aCustomer.age); 

    printf("Inseam: "); 
    scanf("%lf",&aCustomer.inseam); 
    return aCustomer; 
}; 

int main(){ 
    FILE* customersFile = fopen("customers.txt","w"); 
    for (int i = 0; i < 5; i++){ 
    struct ClothingCustomer aCustomer = createACustomer(); 
    fprintf(customersFile, "%s %d %lf\n", aCustomer.name, aCustomer.age,  aCustomer.inseam); 
    } 

    fclose(customersFile); 
    return 0; 
} 

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

Enter Customer Name: 
Age: 
Inseam: 
Enter Customer Name: Age: 
Inseam: Enter Customer Name: Age: 
Inseam: 
Enter Customer Name: Age: 
Inseam: 
Enter Customer Name: Age: 
Inseam: 

Как я могу сделать это не делать этого ? Я попытался использовать:

[^\n] 
fgets(name, sizeof(name), stdin); 

и то же самое происходит каждый раз.

+0

Где пользователь вводит ваш пример взаимодействия? Вы вообще что-то вводите? – DyZ

+3

Вам нужно использовать новую строку после 'scanf ("% lf ", & acustomer.inseam);'. – BLUEPIXY

+3

Всегда ошибка: не проверяйте возвращаемое значение из scanf() и fopen(). – Jens

ответ

1

Это будет работать

#include<stdio.h> 
    #include<string.h> 
    struct ClothingCustomer createACustomer(void); 
    struct ClothingCustomer{ 
     char name[20]; 
      int age; 
     double inseam; 
        }; 

     struct ClothingCustomer createACustomer(void){ 
     struct ClothingCustomer aCustomer; 
     {     //From Here Starts The Part in Which You Are Having Problems. 
     char c; 
     int i; 
     printf("Enter Customer Name: "); 
     scanf("%s",aCustomer.name); 
     i = strlen(aCustomer.name);  // length of user input till first space 
     do{ 
     scanf("%c", &c); 
     aCustomer.name[i++] = c; // reading characters after first space (including it) 
     }while (c != '\n');  // until user hits Enter 

     aCustomer.name[i - 1] = 0;  // string terminating 
     } 
     printf("Age: "); 
     scanf("%d",&aCustomer.age); 

     printf("Inseam: "); 
     scanf("%lf",&aCustomer.inseam); 
     return aCustomer; 
     }; 

     int main(){ 
      FILE* customersFile = fopen("customers.txt","w"); 
      int i = 0; 

      for (i = 0; i < 5; i++){ 
      struct ClothingCustomer aCustomer = createACustomer(); 
      fprintf(customersFile, "%s %d %lf\n", aCustomer.name, aCustomer.age,aCustomer.inseam); 
      } 
      fclose(customersFile); 
      return 0; 
      } 

Я настоятельно рекомендую вам взглянуть на эту answer, это поможет вам много, метод я использовал здесь упоминается в выше answer .Please Дайте That answer Кредит Если этот метод работает для вас. Вот объяснение части, с которой у вас возникла проблема, как она работает сейчас.

Как это работает? Когда пользователь вводит символы со стандартного ввода, они будут храниться в строковой переменной до первого пробела. После этого остальная часть записи останется во входном потоке и дождитесь следующего scanf. Затем у нас есть цикл for, который принимает char посредством char из входного потока (до \ n) и присоединяет их к концу строковой переменной, формируя таким образом полную строку, такую ​​же, как пользовательский ввод с клавиатуры.

0

Неясная почему scanf(" %19[^\n], aCustomer.name)failed для ОП.

Вместо использования scanf() для сложного ввода, отдельный пользовательский ввод от разбора. Полное использование scanf() и использование fgets() для ввода пользовательского ввода. Используйте sscanf(), strtod(), strtol(), strtok() и т. Д. Для разбора.

Обязательно проверьте результат ввода и успешность функций синтаксического анализа.

ОП не указал, как обращаться с неудобным входом. В этом случае ниже приводится нулевой логотип ClothingCustomer. Могут быть полезны дополнительные коды ошибок или сообщения об ошибках.

struct ClothingCustomer createACustomer(void) { 
    // Suggest initializing 
    struct ClothingCustomer zero = { 0 }; 
    struct ClothingCustomer aCustomer = { 0 }; 
    char buffer[100]; 

    printf("Enter Customer Name: "); 
    fflush(stdout); // insure prompt is seen before asking for input 
    if (fgets(buffer, sizeof buffer, stdin) == NULL) return zero; 
    buffer[strcspn(buffer, "\r\n")] = '\0'; // lop off potential line ending 
    if (strlen(buffer) >= sizeof aCustomer.name) return zero; // too long 
    strcpy(aCustomer.name, buffer); 

    printf("Age: "); 
    fflush(stdout); 
    if (fgets(buffer, sizeof buffer, stdin) == NULL) return zero; 
    if (sscanf(buffer, "%d", &aCustomer.age) != 1) return zero; 
    // Let us do some range checking 
    // https://en.wikipedia.org/wiki/List_of_the_verified_oldest_people 
    if (aCustomer.age < 0 || aCustomer.age > 122) return zero; 


    printf("Inseam: "); 
    fflush(stdout); 
    if (fgets(buffer, sizeof buffer, stdin) == NULL) return zero; 
    if (sscanf(buffer, "%lf", &aCustomer.inseam) != 1) return zero; 

    return aCustomer; 
}