复制argv并检查它是否为回文

时间:2017-10-14 18:40:05

标签: c palindrome

我正在写一个程序来检查回文。我最近选择了C,并且想知道为什么我对它的看法不起作用?是否与我直接将argv复制到char数组有关?

 #include <stdio.h>
 #include <string.h>
 #include <ctype.h>

 int main(int argc,char *argv[]){
   int i;
   int a;
   int size;


   for(a = 1; a < argc; a++){
      char *reverseThis = argv[a];
      char *normal = argv[a];
      size = strlen(reverseThis);
      for(i = 0; i < size; i++){
          reverseThis[i] = normal[size - i - 1];
      }
      for(i = 0; i < size; i++){
        reverseThis[i] = tolower(reverseThis[i]);
        normal[i] = tolower(normal[i]);
      }
      if(strcmp(reverseThis,normal)==0){
          printf("\"%s\": on palindromi\n",argv[i]);
      }
       else
          printf("\"%s\": ei ole palindromi\n",argv[i]);
     }
   return 0;
}

4 个答案:

答案 0 :(得分:0)

您使用的方法不正确。

对于初学者来说这个循环

for(i = 0; i < size; i++){
    reverseThis[i] = normal[size - i - 1];
}

在字符串的左半部分以相反的顺序复制字符串的右半部分,完全覆盖其左边部分。

例如,如果您有一个类似于此"123456"的字符串,那么在循环之后它将看起来像"654456"

这种比较也没有意义

if(strcmp(reverseThis,normal)==0){

因为两个指针都指向同一个字符串。所以条件总是正确的。

考虑到这些声明

char *reverseThis = argv[a];
char *normal = argv[a];

不要复制argv[a]指向的原始字符串。声明的指针只指向同一个字符串的第一个字符。

这是一个错字

printf("\"%s\": on palindromi\n",argv[i]);
                                     ^^^

可以在不更改字符串的情况下更简单地完成任务。

例如

size_t n = strlen( argv[a] );
size_t i = 0;

while ( i < n / 2 && tolower( ( unsigned char )argv[i] ) == tolower( ( unsigned char )argv[n -i - 1] ) ) ++i;

if ( i == n / 2 )
{
    printf("\"%s\": on palindromi\n", argv[a]);
}
else
{
    printf("\"%s\": ei ole palindromi\n",argv[a]);
}

如果确实需要复制字符串,则要么声明可变长度数组(如果编译器支持它们),要么动态分配数组。例如(声明可变长度数组):

size = strlen( argv[a] );
char reverseThis[size + 1];
char normal[size + 1];

strcpy( reverseThis, argv[a] );
strcpy( normal, argv[a] );

答案 1 :(得分:0)

在您的代码中,您没有复制字符串,您将normalreverseThis分配给相同的字符串argv[a]。反之,您需要在分配内存后复制argv[a] 。 只需在for循环中修改您的代码:

for(a = 1; a < argc; a++){

    char *normal = argv[a];
    size = strlen(normal);
    char *reverseThis = (char*)malloc((size+1)*sizeof(char));
    int j=0;
    for(i = size-1; i >= 0; i++){
      reverseThis[j++] = normal[i];
    }
    reverseThis[j]='\0';
    .
    .

答案 2 :(得分:0)

您不需要反转字符串并进行比较以确定输入字符串是否为回文结构。

您可以简单地比较从字符串两端开始的字符串的字符,并从字符串的开头向前移动一个字符,从字符串的末尾向后移动一个字符。如果所有字符都匹配,直到你到达字符串的中间,那么字符串就是回文,否则不是回文。

#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main(int argc,char *argv[]){
    int i, a, size;

    for(a = 1; a < argc; a++){
        char *ptr= argv[a];
        int notpalindrom = 0;

        size = strlen(ptr) - 1;
        for(i = 0; i < size; ){
            if (tolower(ptr[i++]) != tolower(ptr[size--])){
                notpalindrom = 1;
                break;
            }
        }
        if (notpalindrom)
            printf ("%s is not palindrom\n", ptr);
        else
            printf ("%s is palindrom\n", ptr);
    }
    return 0;
}

答案 3 :(得分:-3)

第一个“if”从索引“i”中的argv获取,i ==到最后一个“for”中更改的更改,在您的情况下i == 4,程序崩溃导致他们的isn'该成员中的t字符串,用于修复您应该在“if”之前将“i”更改为0。