Nick_is_asking Ответов: 2

C проблема с массивом и указателем


Я пытаюсь ввести строку в качестве входных данных.



Когда я даю , например, "Hello world" в качестве входных данных, я получаю "Hello" только без "World".Почему это происходит и как я могу это посеять???

Спасибо...

Что я уже пробовал:

int main(void)
{   
    char *A = "Player_1";
    char *B = "Player_2";
    char *word_A = malloc(sizeof(char) * 50);
    word_A = get_word(A,B);
    printf("Word_A => %s\n" , word_A);
}



char *get_word(char *player_A , char *player_B)
{
    char *word = malloc(50);
    printf("%s give a word without %s looking at it: " , player_A , player_B);
    scanf("%s" , word);
    return word;
}


Когда я даю , например, "Hello world" в качестве входных данных, я получаю "Hello" только без "World".Почему это происходит и как я могу это посеять???

Спасибо...

Richard MacCutchan

Почему вы изменили весь свой код с оригинала? Опубликованные решения теперь не имеют никакого смысла.

А ответ на ваш вопрос можно найти, изучив документацию по scanf.

Nick_is_asking

Да,я изменил его ,потому что хотел сделать что-то еще, что было у меня на уме.Не берите в голову.Любой желающий может увидеть мой новый вышеприведенный код без каких-либо проблем/пропустить часть program.So-есть какая-нибудь помощь???

2 Ответов

Рейтинг:
2

CPallini

Цитата:
int length = sizeof(for_data_words) / sizeof(for_data_words[0]);
Внутри функции это логическая ошибка, потому что разложения массива См., например:: https://medium.com/@prafullkumar77/array-decay-in-c-c-ways-to-prevent-it-485e86839008[^].
Я бы остался простым, например
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>



int main(void)
{
    srand(time(NULL));
    const char * data_words[] = {"knowledge","fantasy","inspiration","practice","construction","creation" };
    const size_t ITEMS = sizeof(data_words) / sizeof(data_words[0]);
    int position = rand() % ITEMS;
    printf("%s\n\n" , data_words[position]);
    return 0;
}


Rick York

Это было информативно для меня. Я никогда не слышал о распаде массива. Это лучшее объяснение того, почему размерные доказательства-плохая идея.

CPallini

Да, это хорошая для понимания причуда C/C++.

Рейтинг:
1

Rick York

Ключ к разгадке находится в сообщении об ошибке. Там написано, что вы передали ему "чар **". Вот что вы должны передать ему, чтобы код выглядел следующим образом :

int rand_choice_data_words(char ** for_data_words)
{
    int length = sizeof(for_data_words) / sizeof(for_data_words[0]);
    int pos = (rand() % (length - 1) + 1);
    return pos;
}

int main(void)
{
    srand(time(NULL));
    char *data_words[] = {"knowledge","fantasy","inspiration","practice","construction","creation"};
    int position = rand_choice_data_words(data_words);
    printf("%s\n\n" , data_words[position]);
    return 0;
}
Вы заметили, что единственная причина, по которой вы передали массив, - это то, что вы можете выяснить, насколько он велик? Я думаю, что лучший вариант-это выяснить это вне функции. Вот способ, которым вы можете сделать это, подсчитав :
int random_choice( int listSize )
{
    int pos = rand() % listSize;
    return pos;
}

int main(void)
{
    char *words[] =
    {
        "knowledge"
        , "fantasy"
        , "inspiration"
        , "practice"
        , "construction"
        , "creation"
        , NULL
    };

    int count = 0;
    int n;

    srand( time(NULL) );
    for( int n = 0; words[ n ] != NULL; ++n )
        ++count;
    int position = random_choice( count );
    printf("%s\n\n" , words[ position ] );
    return 0;
}
Это использует нуль в конце списка, чтобы действовать как Терминатор. Я думаю, что алгоритм случайных чисел тоже был немного не в порядке. Если в списке есть пять элементов, индексы into могут варьироваться от 0 до 4. Оператор по модулю с пятью также даст результаты в диапазоне от 0 до 4, так что нет необходимости вычитать из числа слов. Вы также не хотите добавлять его, иначе вы никогда не будете использовать пункт 0, а пункт 5 недействителен.


CPallini

5.