首页 > 解决方案 > 为什么 puts() 在 C 中的输出上打印一些垃圾值

问题描述

我正在尝试用 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");
}

结果是准确的,但打印不正确。为什么 ?

标签: cc-stringspalindromegarbagefunction-definition

解决方案


创建的数组不包含字符串,因为数组中没有终止零。

也不需要定义一个辅助数组来确定传递的字符串是否是回文。

在函数中创建可变长度数组是不安全的,并且可能导致堆栈溢出。除此之外,函数的用户可以将小于或等于 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.

推荐阅读