Почему put () печатает некоторые значения мусора на выходе в C - PullRequest
0 голосов
/ 26 апреля 2020

Я пытаюсь сделать функцию на C языке, который проверяет, является ли String палиндроми c (читайте так же, начиная с начала и до конца). Поэтому я использую функцию puts() для печати строки в обратном порядке, и после ряда элементов (> 7) она печатает некоторые нежелательные символы.

Моя процедура:

void isPal ( char ptr[], int i){


    char array[i];

    int j=0,k=0;
    int l = i-1;

    for (j=0; j<i ; j++){
        array[j] = ptr[l]; printf("%c\t", array[j] );

        printf("Character :%c -> [%d]\n", array[j],l );
        l--; 
    }

    printf("\nThe upside string is : ");
    puts(array);


    for (k=0; k<i ; k++){
        if ( array[k] != ptr[k]){

            printf("\nNot palindromic!!!\n");
            return; 
        }
    }
    printf("\nIS PALINDROMIC..\n");
}

Результат точный, но печать не правильная. Почему это?

Ответы [ 2 ]

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

Созданный массив не содержит строку, поскольку в массиве нет завершающего нуля.

Также нет необходимости определять вспомогательный массив для определения, является ли переданная строка палиндромом.

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

Функция должна делать только одно, то есть определить, переданная строка является палиндромом.

Вызывающая функция решает, какое сообщение выводить, если оно есть.

Параметр функции, который указывает массив, должен иметь квалификатор const поскольку переданная строка не изменяется в функции.

Функция может быть определена следующим образом

int isPal ( const char *s )
{
    size_t n = strlen( s );

    size_t i = 0;

    while ( i < n / 2 && s[i] == s[n-i-1] ) ++i;

    return i == n / 2;
}

Вот демонстрационная программа.

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

int isPal ( const char *s )
{
    size_t n = strlen( s );

    size_t i = 0;

    while ( i < n / 2 && s[i] == s[n-i-1] ) ++i;

    return i == n / 2;
}

int main(void) 
{
    const char *s = "123454321";

    printf( "The string \"%s\" is %sa palindrome.\n",
            s, isPal( s ) ? "" : "not " );

    return 0;
}

Его выход составляет

The string "123454321" is a palindrome.
1 голос
/ 26 апреля 2020

Просто замените char array[i]; на следующие две строки:

char array[i+1];
array[i] = '\0';

puts() принимает string в качестве аргумента. В c строка в основном является символьным массивом с '\0' в конце. Таким образом, когда мы добавляем '\0' в конце array[], он становится строкой и в результате puts() не показывает непредсказуемого поведения.

...