2017-10-14 12 views
0

전 기호를 확인하는 프로그램을 작성 중입니다. 나는 최근에 C를 집어 들었고 거기에 대한 나의 생각이 효과가 없을 이유가 있는지 궁금해하고 있었다. argv를 문자 배열에 직접 복사하는 것과 관련이 있습니까?argv를 복사하고 회문을 확인하는 중

#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; 
} 
+2

어느 쪽도'문자는 * reverseThis = 변수는 argv는 [A]'나'의 char *이 정상 =는 argv를 [A]'복사, 같은 문자열 /'char' 배열에 모두 포인터를 가리키는 - 복사가 수행되지 않습니다 ['strcpy'] (http://en.cppreference.com/w/c/string/byte/strcpy) 함수를 통해 – UnholySheep

답변

0

잘못된 접근 방식을 사용하고 있습니다. 우선 들어

이 루프

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

사본 완전히의 왼쪽 부분을 덮어 문자열의 왼쪽 절반 역순 문자열의 오른쪽 절반.

예를 들어

"123456" 같은 문자열이 다음 루프 후에는 모두 포인터가 같은 문자열을 가리 있기 때문에 비교는 의미

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

가되지 않습니다 "654456"

모양을 경우 . 따라서 조건은 항상 사실입니다.

이 선언

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]); 
-3

첫 번째 인덱스에 ARGV 걸릴 "만일" "나는"나는 귀하의 경우, "를"마지막에 변경 최종 변경에 == i == 4이고 프로그램이 충돌하여 해당 멤버의 문자열이 아니기 때문에 "if"앞에 "i"를 0으로 변경해야한다고 수정했습니다. 코드에서

0

당신이 문자열을 복사하지 않습니다, 당신은 argv[a] .IN reverseThis 당신이 메모리를 할당 한 후 argv[a]을 복사 할 필요 같은 문자열로 normalreverseThis 모두 할당. 그냥 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'; 
    . 
    . 
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; 
}