我正在写一个程序来检查回文。我最近选择了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;
}
答案 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)
在您的代码中,您没有复制字符串,您将normal
和reverseThis
分配给相同的字符串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。