2015-10-02 6 views
0

Моя цель с помощью этой программы - включить входные данные пользователей в своего рода интерактивную/рандомизированную историю, но я не уверен, как я должен получать входные данные от пользователей, чтобы они находились между *ptrDescription , *ptrBeginning, *ptrMiddle, и *ptrEnd. Любая помощь будет очень, очень ценится!Интерактивная рандомизированная программа в C

#include <stdio.h> 
#include<stdlib.h> 
#include<time.h> 
#include <string.h> 
#include <ctype.h> 

int main(void){ 

    int i; 
    char name[20]; 
    char color[20]; 
    int age; 
    char sentence[1]; 
    //array of pointers to char arrays 
    char *ptrDescription[]={"the painfully handsome","the one and only","who seemed much older than"}; 
    char *ptrBeginning[]={"was blissfully ignoring","could clearly see","had no idea"}; 
    char *ptrMiddle[]={"the huge truck","the falling meteor","the bucket of milk","the mailman","the most powerful wizard"}; 
    char *ptrEnd[]={"that was barreling toward them.","on the horizon."}; 

    srand(time(NULL)); 

    printf("Enter your first name: "); 
    scanf("%s", &name); 
    printf("\nEnter your age: "); 
    scanf("%d", &age); 
    printf("\nEnter your favorite color: "); 
    scanf("%s", &color); 


    for (i = 0; i < 1; i++) 
    { 
     //strcpy(sentence,ptrDescription[rand()%3]); 
     //strcat(sentence," "); 
     //strcat(sentence,ptrBeginning[rand()%3]); 
     //strcat(sentence," "); 
     //strcat(sentence,ptrMiddle[rand()%5]); 
     //strcat(sentence," "); 
     //strcat(sentence,ptrEnd[rand()%2]); 
     //strcat(sentence,"."); 
     //sentence[0]=toupper(sentence[0]); 

     puts(sentence); 
    } 

    getch(); 
    return 0; 
} 

EDIT:

Я редактировал раздел моего кода, так что сразу после for (i = 0; i < 1; i++) он теперь выглядит следующим образом:

snprintf(sentence, sizeof sentence,"%s, %s %d year old, %s %s %s %s", name, ptrDescription[rand()%3], age,ptrBeginning[rand()%3], ptrMiddle[rand()%5], ptrEnd[rand()%2]); 

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

«Введите ваше имя: Джастин

Введите свой возраст: 20 Джастин, высокомерный 20-летний, целенаправленно игнорируя самый мощный мастер, который катился к ним.汽 $ 0HβHζ (テ フ フ フ フ フ フ フ フ フ フ フ フ フ H · (D キ HH 広 $ 0 陏 & · 汽 $ 0 タ Hζ (テ フ フ フ フ フ フ フ フ フ フ フ フ フ フ フ H WH · H 櫛 H · t9HνH テ < "

Каждый знает, как я могу избавиться от них?

+0

Hi Justin. Что вы хотите сделать? Заставить пользователя установить семя для функции rand()? Или использовать пользовательский ввод вместо rand()? – mescarra

+0

Я стараюсь, чтобы результат был чем-то вроде: «Джастин, мучительно красивый 20-летний, был блаженно игнорировал ведро молока, которое было болото к ним», а затем рассказ будет случайным образом каждый раз, когда программа была повторно запущена , –

+0

'* ptrDescription' и т. Д. - это первые элементы их соответствующих массивов (а не указатели на!). Не уверен, что вы действительно этого хотите, я подозреваю, что вы хотите ** длину ** ** массивов ** 'ptrDescription' и т. Д. – Olaf

ответ

0

Если вы alrea dy имеют имя и возраст, это просто вопрос вставки их в правильное место в sentence, правильно? Таким образом, strcat(sentence, name) будет работать для имени. age немного сложнее, так как вам нужно отформатировать номер первым, и strcat не сделает это за вас. Одним из решений было бы использовать sprintf(buf, "%d", age), а затем объединить buf (который представляет собой массив царапин, который вы должны были бы объявить).

Каждый раз, когда вы работаете со строками в C, вы должны быть обеспокоены наличием достаточного пространства в целевом буфере. Ваша программа может не работать во время ввода и вывода. Для вывода я бы полностью избавился от sentence; так как вы просто заканчиваете писать на stdout, я бы printf("%s", [part]) каждую часть, как вы идете. Для чтения scanf поддерживает добавление аргумента длины в строку формата.

Если вы используете один из функций * PRINTF, есть 2 вещи, которые вы должны быть осторожны:

  1. аргументы вы передаете правильны для форматной строки вы используете
  2. Ваш буфер заканчивается нуль -завершённый

Ваша текущая проблема с # 1 - ваша строка формата обещает 7 аргументов, чтобы следовать, но вы только поставку 6. snprintf хватает «случайного» 7-значение из стека, интерпретирует его как указатель полукокса, и копирует все, что находит до sentence. Вы могли видеть подобные проблемы, если ваша строка формата обещала указатель на char, но вы помещали int в заданную позицию. В этом случае строка формата является константой, поэтому интеллектуальный компилятор может подтвердить, что ваша строка формата соответствует последующим параметрам. Вы хотите привыкнуть серьезно относиться к предупреждениям компилятора и не игнорировать их.

Второй вопрос может быть проблемой, если ваше предложение оказалось больше, чем буфер предложения. Если нет места нулевому терминатору, он не будет применяться.Вы можете проверить возвращаемое значение snprintf, или вы можете с защитой всегда записывать 0 в последнюю позицию массива.

+0

Это помогает совсем немного, но вы могли бы дать мне и пример вывода 'printf ("% s ", [part])', о котором вы говорите? Я пытаюсь это сделать, но я не уверен, как сохранить рандомизированные результаты. –

+0

Если вы видите мои изменения в моем сообщении выше, я действительно понял, что вы упомянули, но теперь я получаю странный вывод, который я не уверен, как исправить. Есть идеи? –

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