使用 C 查找字符串中的所有回文
Find all Palindromes in a String Using C
我正在尝试使用 C 打印字符串中的所有回文和 return 总数。
我的代码是 returning 各种不是回文的子串并打印空白。
我的 printf 语句格式至少有一个偏差,而且在我的数组元素比较中,它的工作方式与我预期的相反。
谁能看出我错在哪里?
这是我的代码:
#include<stdio.h>
#include<string.h>
char x[1000];
void getString(char *n)
{
printf("\nPlease enter your string: ");
scanf("%s", n);
}
int findPals(char *s)
{
int length = strlen(s);
int numPals = 0;
//find odd palindromes
for(int i = 0; i < length; i++)
{
for(int j = 0; j + i < length && i - j >= 0; j++)
{
if(s[i + j] != s[i - j])
continue;
else
{
numPals++;
printf("%.*s\n", (j - i),s + i);
}
}
}
//find even palindromes
for(int i = 0; i < length; i++)
{
for(int j = 0; j + i + 1 < length && i - j >= 0; j++)
{
if(s[i + j + 1] != s[i - j])
continue;
else
{
numPals++;
printf("%.*s\n", (j - i),s + i);
}
}
}
return numPals;
}
int main()
{
char inStr[1000];
int totalPals;
getString(inStr);
totalPals = findPals(inStr);
printf("I found %d palindromes.\n", totalPals);
return 0;
}
您的代码(在下面给出)中只需要 2 个小的更正,除此之外一切都很好:-
1.Continue 数组检查中的语句应更改为 break:
for(int i = 0; i < length; i++)
{
for(int j = 0; j + i < length && i - j >= 0; j++)
{
if(s[i + j] != s[i - j])
break; // continue statement has been changed to break;
else
{
numPals++;
printf(".*s\n",(2*j)+1,&s[i-j]); // The length of the string has been modified
}
}
}
printf
中的字符串长度不正确。
奇数段使用:
printf(".*s\n",(2*j)+1,&s[i-j]);
偶数部分使用:
printf(".*s\n",(2*j)+2,&s[i-j]);
感谢您的帮助。这是我的最终计划。
#include<stdio.h>
#include<string.h>
char x[1000];
void getString(char *n)
{
printf("\nPlease enter your string: ");
scanf("%s", n);
}
int findPals(char *s)
{
int length = strlen(s);
int numPals = 0;
//find odd palindromes
for(int i = 0; i < length; i++)
{
for(int j = 0; j + i < length && i - j >= 0; j++)
{
if(s[i + j] != s[i - j])
break;
else
{
if ((j + j) > 1)
{
numPals++;
printf("%.*s\n", ((2 * j) + 1), &s[i - j]);
}
}
}
}
//find even palindromes
for(int i = 0; i < length; i++)
{
for(int j = 0; j + i + 1 < length && i - j >= 0; j++)
{
if(s[i + j + 1] != s[i - j])
break;
else
{
if ((j + j) > 1)
{
numPals++;
printf("%.*s\n", ((2 * j) + 2), &s[i - j]);
}
}
}
}
return numPals;
}
int main()
{
char inStr[1000];
int totalPals;
getString(inStr);
totalPals = findPals(inStr);
printf("I found %d palindromes.\n", totalPals);
return 0;
}
我正在尝试使用 C 打印字符串中的所有回文和 return 总数。
我的代码是 returning 各种不是回文的子串并打印空白。
我的 printf 语句格式至少有一个偏差,而且在我的数组元素比较中,它的工作方式与我预期的相反。
谁能看出我错在哪里?
这是我的代码:
#include<stdio.h>
#include<string.h>
char x[1000];
void getString(char *n)
{
printf("\nPlease enter your string: ");
scanf("%s", n);
}
int findPals(char *s)
{
int length = strlen(s);
int numPals = 0;
//find odd palindromes
for(int i = 0; i < length; i++)
{
for(int j = 0; j + i < length && i - j >= 0; j++)
{
if(s[i + j] != s[i - j])
continue;
else
{
numPals++;
printf("%.*s\n", (j - i),s + i);
}
}
}
//find even palindromes
for(int i = 0; i < length; i++)
{
for(int j = 0; j + i + 1 < length && i - j >= 0; j++)
{
if(s[i + j + 1] != s[i - j])
continue;
else
{
numPals++;
printf("%.*s\n", (j - i),s + i);
}
}
}
return numPals;
}
int main()
{
char inStr[1000];
int totalPals;
getString(inStr);
totalPals = findPals(inStr);
printf("I found %d palindromes.\n", totalPals);
return 0;
}
您的代码(在下面给出)中只需要 2 个小的更正,除此之外一切都很好:-
1.Continue 数组检查中的语句应更改为 break:
for(int i = 0; i < length; i++)
{
for(int j = 0; j + i < length && i - j >= 0; j++)
{
if(s[i + j] != s[i - j])
break; // continue statement has been changed to break;
else
{
numPals++;
printf(".*s\n",(2*j)+1,&s[i-j]); // The length of the string has been modified
}
}
}
printf
中的字符串长度不正确。
奇数段使用:
printf(".*s\n",(2*j)+1,&s[i-j]);
偶数部分使用:
printf(".*s\n",(2*j)+2,&s[i-j]);
感谢您的帮助。这是我的最终计划。
#include<stdio.h>
#include<string.h>
char x[1000];
void getString(char *n)
{
printf("\nPlease enter your string: ");
scanf("%s", n);
}
int findPals(char *s)
{
int length = strlen(s);
int numPals = 0;
//find odd palindromes
for(int i = 0; i < length; i++)
{
for(int j = 0; j + i < length && i - j >= 0; j++)
{
if(s[i + j] != s[i - j])
break;
else
{
if ((j + j) > 1)
{
numPals++;
printf("%.*s\n", ((2 * j) + 1), &s[i - j]);
}
}
}
}
//find even palindromes
for(int i = 0; i < length; i++)
{
for(int j = 0; j + i + 1 < length && i - j >= 0; j++)
{
if(s[i + j + 1] != s[i - j])
break;
else
{
if ((j + j) > 1)
{
numPals++;
printf("%.*s\n", ((2 * j) + 2), &s[i - j]);
}
}
}
}
return numPals;
}
int main()
{
char inStr[1000];
int totalPals;
getString(inStr);
totalPals = findPals(inStr);
printf("I found %d palindromes.\n", totalPals);
return 0;
}