以下是我为了找到字符串回文中缺少的字符而编写的代码,但我不知道在同时检查两边的字符串时如何找到必须打印的字符。
#include <stdio.h>
#include <stdlib.h>
int main() {
char s[100], m[100];
fgets(s, 100, stdin);
int len = strlen(s);
int a, b;
for (int i = 0; i < strlen(s); i++) {
m[i] = s[len - i - 1];
}
for (int i = 0, j = 0; i <= strlen(s), j <= strlen(s); i++, j++) {
if (isspace(m[j])) {
j++;
}
if (s[i] != m[j]) {
if (len % 2 == 0) {
printf("%c", m[j]);
break;
} else {
printf("%c", s[i]);
break;
}
}
}
}
输入:Malayaam
输出:l
输入:abcddcb
输出:a
答案 0 :(得分:2)
假设回文中始终存在一个错误,我建议查看每一行的下一个字母,以确定哪两个不相同的字母是丢失的。
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int main(void)
{
char s[100],m[100];
fgets(s,100,stdin);
int len=strlen(s)-1;
int i,j;
for(i=0;i<len;i++)
{
m[i]=tolower((unsigned char)s[len-i-1]);
s[i]=tolower((unsigned char)s[i]);
}
for(i=0,j=0;i<len;i++,j++)
{
if(s[i]!=m[j])
{
printf("%c != %c, ", s[i], m[j]);
if(s[i+1]==m[j])
{ printf("but %c == %c, %c should be inserted on the right.\n", s[i+1], m[j], s[i]);
} else if(s[i]==m[j+1])
{ printf("but %c == %c, %c should be inserted on the left.\n", s[i], m[j+1], m[j]);
} else
{ printf("giving up.\n");
}
break;
}
}
return 0;
}
注意:
i
)。 答案 1 :(得分:2)
通过识别输入可能具有不需要参与测试的尾随'\n'
来减少问题。
#include <ctype.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
int main(void) {
char s[100];
fgets(s, sizeof s, stdin);
s[strcspn(s, "\r\n")] = '\0';
size_t len = strlen(s);
当字符串由于1“额外”字符而不是回文时,删除左或右字符可能无法辨别,直到剩余字符串的相当大量的处理。代码需要考虑2条路径。
size_t mismatch;
if (is_palindrome(s, len, &mismatch)) {
puts("Palindrome");
} else if (is_palindrome(s + mismatch + 1, len - mismatch*2 - 1, NULL)) { // skip left
printf("left <%c>\n", s[mismatch]);
} else if (is_palindrome(s + mismatch, len - mismatch*2 - 1, NULL)) { // skip right
printf("right <%c>\n", s[len - mismatch-1]);
} else {
puts("Not palindrome nor off by 1 palindrome");
}
}
剩下的就是制作is_palindrome()
bool is_palindrome(const char *s, size_t len, size_t *mismatch) {
printf("<%s> %zu\n", s, len);
size_t i = 0;
while (i + 1 < len) {
if (tolower((unsigned char)s[i]) != //
tolower((unsigned char )s[len - 1])) {
if (mismatch) {
*mismatch = i;
}
return false;
}
i++;
len--;
}
return true;
}
答案 2 :(得分:0)
int i;
char s[100];
scanf("%[^\n]s",s);
int l=strlen(s);
for(i=0,j=l-1;i<l,j>=0;i++,j--)
{
if(s[i]!=s[j])
{
if(s[i+1]==s[j])
{
printf("%c",s[i]);
break;
}
else
{
printf("%c",s[j]);
break;
}
}
}
/*find the missing letter in palindrome:
此代码检查字符串的第一个i和最后一个字符j,如果相等,则i递增,j递减。如果不相等,则检查i或j旁边的字符是否与该字符相等,如果i + 1等于j,则i丢失;而当j-1等于i时,j是字符串回文中的丢失字符。* /
答案 3 :(得分:0)
希望这对您有所帮助。
#include<stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int main(void)
{
char ar[102];
int ai=0;
int aj,ak;
scanf("%s",&ar);
ak = strlen(ar)-1;
ai = 0;
while(ai<ak){
if(ar[ai]!=ar[ak]){
if(ar[ai] == ar[ak-1] && ai!=ak-1){
printf("%c",ar[ak]);
break;
}else{
printf("%c",ar[ai]);
break;
}
}
ak--;
ai++;
}
}