c - 为什么 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");
}
结果是准确的,但打印不正确。为什么 ?
解决方案
创建的数组不包含字符串,因为数组中没有终止零。
也不需要定义一个辅助数组来确定传递的字符串是否是回文。
在函数中创建可变长度数组是不安全的,并且可能导致堆栈溢出。除此之外,函数的用户可以将小于或等于 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.
推荐阅读
- scala - 以不那么冗长的方式使用零常量
- html - 格式化有序列表
- CSS
- jquery - Jquery 代码不适用于重复数据
- php - 如何在新窗口中设置会话设置
- php - 提交表单 MS SQL 和 PHP 的问题
- asp.net-core-mvc - 如何在我的 .Net Core 2.1 web api 控制器中实现 Post([FromBody] IMessage msg)?
- api - 如何使用 Shopify api 为订单创建履行服务?
- git - 迁移多个 Git 存储库的更简单方法?
- java - 错误“kafkaconsumer 类型不是通用的,它不能用参数进行参数化”
- selenium - 尽管将焦点切换到它,但无法在弹出窗口中定位元素,硒