gpt4 book ai didi

c - 制作一个程序来实现与数组一起使用的函数

转载 作者:行者123 更新时间:2023-12-04 10:30:18 25 4
gpt4 key购买 nike

做一个我必须实现一些功能的任务。其中一个功能是检查字符串是否为回文。

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

char string[] = "cameron";
char string2[] = "mah";
char palindrome[] = "madam";
char notPalindrome[] = "music";

int removeChar(char *str1, char * str2, char c){
int length = 0;
for (int i = 0; str1[i] != '\0'; i++){
length++;
}
for (int i = 0; i <= length; i++){
if (str1[i] == c){
str2[i] = '*';
}
else {
str2[i] = str1[i];
}
}
for (int i = 0; i<= length; i++){
printf("%c", str2[i]);
}
}

int isPalindrome(char *str){
int length = 0;
for (int i = 0; str[i] != '\0'; i++){
length++;
}
int j = length - 1;
int reversible = 0;
for (int i = 0; i < j; i++){
if (str[i] != str[j]){
reversible++;
break;
}
j--;
}
if (reversible > 0){
printf("\nString is not a palindrome\n");
}
else {
printf("\nString is replaceable\n");
}
}

int main(){
removeChar(string, string2, 'm');
isPalindrome(palindrome);
return 0;
}

当我运行这段代码时,它说字符串不是回文,但如果我将 isPalindrome(palindrome); 更改为 isPalindrome("madam"); 它有效。

另外,为什么如果我注释掉 //removeChar(string, string2, 'm');isPalindrome() 将正常工作。

最佳答案

你有缓冲区溢出。 removeChar 隐式假定 str2str1 的长度相同。所以当你运行这个时:

for (int i = 0; i <= length; i++){
if (str1[i] == c){
str2[i] = '*';
}
else {
str2[i] = str1[i];
}
}

str1"cameron" 并且 str2"mah" 时,你超越了str2 并放入存储palindrome 的内存中。因此,在您运行 removeChar(string, string2, 'm'); 之后,用于保存 mah\0char[] 现在保存了ca*e 和用于保存 madam\0char[] 现在保存 ron\0m\0 .显然,"ron" 不是回文。尝试在 removeChar(string, string2, 'm'); 之后打印字符串的值,您应该会看到它的实际效果。

顺便说一句,你被允许在没有段错误的情况下这样做的唯一原因是因为你使用的是 char[] 而不是 char* .您可能更喜欢在数组上使用指针,这样这样的事情就不会悄无声息地失败。

关于c - 制作一个程序来实现与数组一起使用的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60536663/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com