我还是初学者编码器,我在编写程序时无法使用<stdio.h>
和<stdlib.h>
库检查字符串是否为回文序列。
该字符串最多可包含30个字符。我们必须假设字符串可以采用数字,标点符号和字母。另外,假设字符串中没有空格。必须区分大写和小写字符。所以&#34;女士&#34;将是一个回文,但&#34; MaDam&#34;不会是回文。该字符串以null终止符结尾。 嗨,所以当我用gcc -Wall编译时。我收到这些错误。有人可以解释我如何解决这些错误吗?谢谢你的时间。
s_palindrome.c:24:15: warning: variable 'length' is used uninitialized whenever
'for' loop exits because its condition is false
[-Wsometimes-uninitialized]
for (a=0; **a<30**; a++){
is_palindrome.c:36:18: note: uninitialized use occurs here
for (a=0; **a<(length/2)**; a++){
is_palindrome.c:24:15: note: remove the condition if it is always true
for (a=0; **a<30**; a++){
is_palindrome.c:12:18: note: initialize the variable 'length' to silence this
warning
**int a, length;**= 0
代码
#include <stdio.h>
#include <stdlib.h>
int main (){
char string [30];
int a, l;
int p=1;
printf("Enter a string to test: \n");
scanf("%s", string);
for (a=0; a<30; a++){
if (string[a]=='\0'){
l=a;
break;
}
}
for (a=0; a<l/2; a++){
if (string[a]!=string[l-1-a]){
p=0;
}
}
if (p){
printf("%s is a palindrome\n", string);
}
else {
printf("%s is not a palindrome\n", string);
}
return 0;
}
答案 0 :(得分:3)
以下是我已经测试过的代码的更正版本:
#include <stdio.h>
#include <stdlib.h>
int main ()
{
char str[30], temp[30];
int first, last, e;
printf("Enter a string: ");
scanf("%s", str);
for (first=0; str[first]!='\0'; first++)
{
e = first;
}
// loop finds the length of the string, e=first is the index of the last character of the string
// code to store reverse of str in temp
for (first = 0, last = e; str[first] != '\0'; first++, last--)
{
temp[first] = str[last];
}
temp[first] = '\0';
// code to compare str and reverse of str i.e. temp
for (first=0; str[first]!='\0'; first++)
{
// if any character in str and reverse str i.e. temp is unequal, break the loop
if(str[first]!=temp[first])
{
printf("%s is not a palindrome!\n",str);
break;
}
}
// if loop did not break str and reverse str i.e. temp are equal
if(str[first]=='\0')
{
printf("%s is a palindrome.\n",str);
}
return 0;
}
有几个问题,例如:
char string[30];
已声明但str
已使用。
e=first
将不等于字符串的长度,而是比它小1,这使得它成为字符串最后一个字符的索引。
e
错误地使用了for (first=0, first=e; str[first]!='\0',first>=0, first++, last--)
,其中first
初始化两次,使其失去初始值。相反,last
应该已初始化为e。此外,for
循环可以有多个初始化以及递增/递减(用逗号分隔),但不能有多个条件。初始化,条件和增量/减量之间的分隔符应该是分号;
,在您的情况下缺少。
循环结束时不需要continue;
语句,因为continue
与break
不同,用于阻止当前迭代进一步执行和移动到下一次迭代。因为,在这里你没有更多的代码要在当前的迭代中执行,continue
是多余的,不需要。
printf
功能使用不当。在此函数中,您必须提供格式说明符作为第一个输入,这是输出将如何呈现的格式。应在此处指定要包含在最终输出中的所有变量的所有换行符'\ n',空格和占位符。printf
的其余参数将包含所有变量,占位符已包含在其中在作为第一个参数传入的格式说明符字符串中定义。
最后一个}
缺少大括号if
。
我已经更正了您发布的基本算法,但效率不高。更有效的算法,将避免创建另一个反向数组。相反,它会开始在同一个字符串中比较第一个和最后一个索引的字符,先递增,然后在每一步递减,直到达到中间字符。
答案 1 :(得分:1)
存在许多问题,其中大多数都会阻止您的程序编译。
string
,但在其他地方使用str
。因此,请将定义更改为str
。printf("%s is not a palindrome!"\n);
:换行符位于字符串之外,并且您没有将str
作为参数传递给它。printf("%s is a palindrome. \n");
:同样,str
未传入打印for (first=0, first=e; str[first]!='\0',first>=0, first++, last--){
;
。它应该在first++
之前。||
或&&
。但是,在这种情况下,只需要第一部分,因此您可以删除第二部分。last
。 first=e
应为last=e
; for (first=0, last=e; str[first]!='\0'; first++, last--){
}
之前遗漏return
。if(str[first]==temp[first]) continue;
可以删除,因为无论如何你都在循环的底部。答案 2 :(得分:1)
int valid=1;//is palindrome
for(i=0, j=e; i<j; ++i, --j) {
if(str[i] != str[j]){
valid=0;
break;
}
}
这有帮助吗?看起来你正在过度思考这个问题
答案 3 :(得分:0)
#include<stdio.h>`
#include<string.h>
int main(void)
{
char name[10];
int x,i,r,count = 0;
printf("Enter the Name : ");
scanf("%s",&name);
x = strlen(name);
r = x - 1;
for(i = 0 ; i < x ; i++)
{
if(name[i] == name[r])
{
count = count + 1;
}
else
{
break;
}
r = r - 1;
}
if(count == x)
printf("%s is a Palindrome\n",name);
else
printf("%s is not a Palindrome\n",name);
}
答案 4 :(得分:-2)
这是代码
#include <stdio.h>
#include <stdlib.h>
int main (){
char str[30];
int i, len=0;
int flag=1;
printf("Enter a string: \n");
scanf("%s", &str);
for (i=0; str[i]!='\0'; i++){
len++;
}
len--;
for(i=0;i<=len/2;i++)
if(str[i]!=str[len-i])
{
flag=0;
break;
}
if(flag==1)
printf("%s is a palindrome. \n", str);
return 0;
}