我接受一个字符串作为命令行参数。我想检查输入的字符串是否为回文,并打印结果。我写了以下代码。但是它显示了所有输入的结果“不是回文”。
#include<stdio.h>
#include<string.h>
int main(int argc, char argv[20]) {
int i;
int l = strlen(argv);
char str[20];
bzero(str, 20);
for(i=0; i<l; i++)
{
str[i] = argv[i+2];
}
int flag;
int len = strlen(str);
for(i=0; i< len/2; i++)
{
if(str[i] == str[len - (i+2)])
{
flag = 0;
}
else
{
flag = 1;
break;
}
}
if(flag == 0)
printf("Palindrome\n");
else
printf("Not a palindrome\n");
}发布于 2010-08-13 05:44:05
您可以通过在for-loop中使用两个偏移量迭代器来实现K&R风格:
#include <stdio.h>
#include <string.h>
#include <assert.h>
int main(int argc, char *argv[]) {
assert(argc != 1);
char *text = argv[1];
int len = strlen(text);
int is_palindrome = 1;
int i, j;
for(i = 0, j = len - 1; i < len / 2; i++, j--) {
if(text[i] != text[j]) {
is_palindrome = 0;
break;
}
}
printf("%s a palindrome.\n", is_palindrome ? "is" : "isn't");
return(0);
}与原始版本相比的更改:
发布于 2010-08-13 15:15:02
根据评论更新:
int is_palindrome(const char *s)
{
const char *t = s + strlen(s);
while (s<t && *s==*--t) s++;
return s>=t;
}由于OP想要一个不会占用大量指针的版本:
int is_palindrome(const char *s)
{
size_t i=0, j = strlen(s);
while (i<j && s[i]==s[--j]) i++;
return i>=j;
}作为参考,这里是原始的buggy版本:
int is_palindrome(const char *s)
{
const char *t = s + strlen(s) - 1;
while (s<t && *s++==*t--);
return s>=t;
}发布于 2010-08-13 03:11:38
首先,你对main的签名已经失效了。它应该是int main(int argc, char** argv)或int main(int argc, char * argv[])。您将一个指向字符串的指针视为一个字符串。
更改后,所需的字符串应为argv[1]格式(因为argv[0]是程序名的某种表示形式)。
https://stackoverflow.com/questions/3471076
复制相似问题