Как сделать условный l oop из вопроса «Да, нет», сравнив строку с инициацией указателя? [C Программирование] - PullRequest
1 голос
/ 26 апреля 2020
int main(int argc, char* argv[]) {
    char* string; //local variable for a character
    string = (char*)malloc(sizeof(char));
    char* yes = "yes";

    printf("Do you want to play (y/n)?");
    scanf_s("%s", string);
    if (strcmp(yes, string) == 0) {
        printf("Hello welcome...");
}

Выше мой код. По сути, я хочу, чтобы al oop попросил пользователя ввести yes, y для продолжения; п, нет, чтобы прекратить. Но я упрощаю это ради простых кодов. Программа просто выводит вопрос, я нажимаю ввод да и ввод, затем он останавливается. Я не могу придумать способ сделать это, используя синтаксис массива (char char [], хотя array и mallo c в основном одинаковы), поэтому вместо них я использую указатель и mallo c. Я схожу с ума, потому что это беспокоит меня так сильно. Практическое задание просит только ввести символ 'y' 'n', используя% c, но я хочу сделать это% s. Действительно ценю любую помощь, я действительно застрял сейчас. Большое вам спасибо

1 Ответ

0 голосов
/ 26 апреля 2020

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

Во-вторых, когда вы используете функцию scanf_s для чтения в строке (используя спецификатор формата %s, как вы сделали), вам нужно добавить дополнительные параметры. (размер целевого строкового буфера) после каждого строкового аргумента.

Вот модифицированная версия вашего кода с этими (и некоторыми другими) исправлениями:

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

int main(int argc, char* argv[])
{
    char* string = malloc(5); //local variable for a character string (up to 5 chars)
    char* yes = "yes";
    printf("Do you want to play (y/n)?");
    scanf_s("%s", string, 5);
    if (strcmp(yes, string) == 0) {
        printf("Hello welcome...");
    }
    free(string); // Don't forget to release the memory!
    return 0; // Conventionally, return 0 for success or non-zero on error
}

Примечание 1: Каждый и каждый вызов malloc (или calloc) должен быть связан с вызовом free для освобождения выделенной памяти, или вы получите утечки памяти .

Примечание 2: Пожалуйста, прочитайте этот пост: Должен ли я привести результат mallo c?

Примечание 3: Хотя большинство (все?) C компиляторов не будут настаивать на этом, рекомендуется явно добавить оператор return 0; (для успеха) a t конец функции main.

Пожалуйста, не стесняйтесь спрашивать о каких-либо дополнительных разъяснениях и / или объяснениях.

...