Функция печати печатает странные символы - PullRequest
0 голосов
/ 07 мая 2020

Я пытаюсь создать случайные строки с помощью этой функции:

static char *rand_string(char *str)
{   
    const char charset[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJK";
    int i;

    for ( i = 0; i < 10; i++) 
    {
        int key = rand() % (int) (sizeof charset - 1);
        str[i] = charset[key];
    }
        str[11] = '\0';

    return str;
}

Проблема в следующем: иногда, когда я собираюсь распечатать указатель, он отображает какой-то странный символ, например: bug Как вы можете видеть при первом запуске, символы в строке равны 10, во втором и третьем запусках символы в строке равны 11 ...

Это моя программа:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>

static char *rand_string(char *str);


int main() 
{

    char *string, //str
         *string_result; //str1


    int dimensione= 15,
        i;

    for(i=0;i<dimensione;i++)
    {
        string_result = rand_string(string);
        printf("%s\n", string_result);

    }
}


static char *rand_string(char *str)
{   
    const char charset[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJK";
    int i;

    for ( i = 0; i < 10; i++) 
    {
        int key = rand() % (int) (sizeof charset - 1);
        str[i] = charset[key];
    }
        str[11] = '\0';

    return str;
}

Вы можете просмотреть и протестировать мой код здесь -> https://onlinegdb.com/r1yY8DWc8

1 Ответ

0 голосов
/ 07 мая 2020

Весь ваш код вызывает неопределенное поведение, потому что вы передаете string, который является неинициализированным указателем, доступ к которому может "не" гарантироваться для 11 байтов, к которым вы обращаетесь в функции rand_string().

Вам необходимо выделить память из main() и передать этот буфер для заполнения функцией генератора случайных строк, таким образом вы получите контроль над изменяемой памятью.

Также for l oop в вашем генераторе уже заполняет индексы от 0 до 9. Чтобы установить последний байт в NULL, вам нужно использовать индекс как 10.

Также заголовки time.h и unistd.h здесь бесполезны. Вот перезапись той же программы с выделенной памятью через malloc(). Также изменил вашу функцию rand_string() на void вместо возврата строки.

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

void rand_string(char *str);


int main() 
{

    int dimensione= 15;

    char *string = malloc(11 * sizeof *string); // extra byte for NULL

    if (!string) return 1;
    int i;

    for(i=0;i<dimensione;i++)
    {
        rand_string(string);
        printf("%s\n", string);
    }

    free(string);
    return 0;
}


void rand_string(char *str)
{   
    const char charset[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJK";
    int i;

    for ( i = 0; i < 10; i++) 
    {
        int key = rand() % (int) (sizeof charset - 1);
        str[i] = charset[key];
    }
        str[10] = '\0';
}

Всегда компилируйте с дополнительными флагами, чтобы включить всевозможные предупреждения от вашего компилятора. Например, с gcc всегда добавляйте -Wall -Wextra, чтобы увидеть предупреждения, которые вы можете исправить со своей стороны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...