Я пытаюсь создать функцию заполнения, которая добавляет подчеркивание к строке. Длина строки должна быть 16, и если строка меньше 16, функция должна добавлять подчеркивание до тех пор, пока длина строки не станет 16, а затем вернуть строку заполнения. Если строка больше 16, функция заполнения должна игнорировать символы и возвращать первые 16 символов строки.

char* padding(char* plaintext){
    char ch = '_';
    size_t len = strlen(plaintext);
    size_t lench = 17 - len;
    char *p_text = malloc(len + 1 + 1);
    strcpy(p_text, plaintext);
    if(len < 17){
        int i;
        for(i = lench; i < 16; i++){
            p_text[i] = ch;
        }
    }
    //p_text[17] = '\0';
    return p_text;
}
 

int main(){
    
    char *key = "0123456789ABCDEF"; 
    while(1){
        char plaintext[WIDTH+1];
        
        printf("Enter a string: ");
        fgets(plaintext, WIDTH+1, stdin);
       
        if(plaintext[0] == '\n' || plaintext[0] == '\r') break;
        
        char* padded_plaintext = padding(plaintext);
        printf("padded plaintext = %s\n", padded_plaintext);
      
        

        printf("\n");
        
    }
    return 0;
}

Этот код возвращает странный результат.

0
John 18 Сен 2021 в 04:00

2 ответа

Лучший ответ

Считайте чистое решение этой проблемы. Надеюсь, это (и сопровождающее объяснение) поможет.

char *padded_string(char *src, int width, char ch) {
    char *dest = calloc(1, width + 1);

    strncpy(dest, src, width);

    for (int i = 0; i < width; i++) {
        if (!dest[i]) {
            dest[i] = ch;
        }
    }

    return dest;
}

Мы обеспечиваем себе чистый лист для работы, выделяя width + 1 байтов с помощью calloc. Использование calloc гарантирует, что все байты будут установлены в 0. При работе со строками в C они должны заканчиваться нулем, поэтому это очень полезно.

Копируем содержимое src в dest. Использование strncpy гарантирует, что мы не получим переполнения буфера, если исходная строка длиннее, чем строка, которой мы хотим закончить.

Затем мы выполняем цикл от 0, width раз. Если символ в строке назначения в i является '\0', мы вставим символ заполнения в этот индекс.

Теперь, поскольку мы использовали calloc и выделили дополнительный байт сверх необходимой нам длины символа, строка уже завершена нулем, мы можем просто вернуть ее указатель.

0
Chris 18 Сен 2021 в 01:45

Пространство, которое вы выделяете для p_text, не должно зависеть от ввода. Всегда должно быть 17. Если len + 1 + 1 <16, то доступ к p_text[i] приведет к неопределенному поведению для определенных значений i, которые вы используете. Вам следует заменить:

char *p_text = malloc(len + 1 + 1);

С участием

char *p_text = malloc(17);

И убедитесь, что p_text не равно NULL, прежде чем писать в него.

Кроме того, закомментированный //p_text[17] = '\0'; неверен. Которые должны быть

p_text[16] = '\0';
1
William Pursell 18 Сен 2021 в 01:07