力扣C语言简单问题
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。说明:本题中,我们将空字符串定义为有效的回文串。
代码:
bool isPalindrome(char * s){
if(s==NULL){//空字符串为有效回文串
return true;
}
char s1;
char s2;
int t=0;int p=0;
for(int i=0;i<sizeof(s);i++){//将字符串中字符变小写后正着输入新字符串
if(s>='A'&&s<='Z'){
s=s+32;
}
if((s>='a'&&s<='z')){
s1=s;
t=t+1;
}
}
for(int j=(sizeof(s)-1);j>=0;j--){//将字符串中字符变小写后倒着输入新字符串
if(s>='A'&&s<='Z'){
s=s+32;
}
if((s>='a'&&s<='z')){
s2=s;
p=p+1;
}
}
if(s1==s2){//判断两个新字符串是否相等
return true;
}
else
{
return false;
}
}
我这个东西有什么问题那?输入"A man, a plan, a canal: Panama"后应该是true,我的代码却是false,找不出问题。 问题很多啊。不一一列举了
字符串操作最好使用专用的函数库 string.h
帮你修改了。
#include <stdio.h>
#include <string.h>
bool isPalindrome(char * s){
if(s==NULL){//空字符串为有效回文串
return true;
}
int len=strlen(s);
char s1;
char s2;
int t=0;int p=0;
for(int i=0;i<len;i++){//将字符串中字符变小写后正着输入新字符串
if(s>='A'&&s<='Z'){
s=s+32;
}
if((s>='a'&&s<='z')){
s1=s;
t=t+1;
}
}
s1='\0';
for(int j=len;j>=0;j--){//将字符串中字符变小写后倒着输入新字符串
if(s>='A'&&s<='Z'){
s=s+32;
}
if((s>='a'&&s<='z')){
s2=s;
p=p+1;
}
}
s2='\0';
if(strcmp(s1,s2)){//判断两个新字符串是否相等
return false;
}
else
{
return true;
}
}
int main(void) {
char str={'\0'};
strcpy(str,"A man, a plan, a canal: Panama");
if (isPalindrome(str))
printf("YES");
else
printf("NO");
return 0;
} sunrise085 发表于 2020-4-25 12:54
问题很多啊。不一一列举了
字符串操作最好使用专用的函数库 string.h
帮你修改了。
你的代码中s1='\0'和s2='\0'这两步是要干什么那,不太懂 害羞的新手 发表于 2020-4-25 16:07
你的代码中s1='\0'和s2='\0'这两步是要干什么那,不太懂
还有到这输入时既然是从0开始的,为什么要j=len而不是j=len-1呢? 本帖最后由 sunrise085 于 2020-4-25 16:56 编辑
害羞的新手 发表于 2020-4-25 16:07
你的代码中s1='\0'和s2='\0'这两步是要干什么那,不太懂
设置字符串的结尾字符。否则的话,printf或者strcmp可能会出错
因为printf打印%s时,是遇到'\0'才结束的。
strcmp比较字符串大小,若前面字符都一致,遇到'\0'就不再比较了。否则,本来相同的两个字符串,因为没有结束字符,会越界对未知的单元行比较,而未知的单元一般是不一样的,那么结果就出错了 sunrise085 发表于 2020-4-25 16:18
设置字符串的结尾字符。否则的话,printf或者strcmp可能会出错
因为printf打印%s时,是遇到'\0'才结束的 ...
我懂了,但是在DVC++上用你这串代码输"OP"时输出no
在力扣上把代码打进去显示"OP"却是错误
页:
[1]