2016-10-07 1 views
-2
void main() 
{ 
    int i, j, k,flag=1; 
    char key[10], keyword[10]; 
    gets(key); 
    i=0; 
    j=0; 
    while(key[i]!='\0') { 
     k=0; 
     while(keyword[k]!='\0') { 
      if(key[i]==keyword[k]) { 
       i++; 
       flag=0; 
       break; 
      } 
      k++; 
     } 
     if(flag==1) { 
      keyword[j]=key[i]; 
      j++; 
      i++; 
     } 
     flag=1; 
    } 
} 

여기에서 배열에서 다른 배열로 고유 한 알파벳을 복사하려고했습니다. 중복 알파벳은 다른 배열에 복사해서는 안됩니다. 올바른 출력을 보여 주지만 보여줍니다 원래의 입력 배열의 길이까지 웃는이나 뭐 같은 일부 쓰레기 값 (iekey은 [])문자 배열에서 일반적인 알파벳을 제거하는 프로그램

+2

출력 문자열의 끝에 터미네이터 문자 ''\ 0 ''을 넣어야합니다. – user3386109

+0

먼저 프로그램을 올바르게 포맷하십시오. –

답변

0

당신은 초기화 될 때 고유 문자열 모두에 터미네이터를 추가해야하고, 때마다 새 편지가 추가되었습니다.

편지가있는 경우 검색

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

int main() { 
    unsigned char seen[1 << (sizeof(char) * 8)] = { 0 }; // a flag for every ASCII character 
    char redundant[32], unique[32]; 

    (void) fgets(redundant, sizeof(redundant), stdin); // gets() is unsafe 

    redundant[strlen(redundant) - 1] = '\0'; // toss trailing newline due to fgets() 

    int k = 0; // unique character counter 

    for (int i = 0; redundant[i] != '\0'; i++) { 
     if (!seen[(size_t) redundant[i]]) { 
      unique[k++] = redundant[i]; 
      seen[(size_t) redundant[i]] = 1; // mark this character as seen 
     } 
    } 

    unique[k] = '\0'; // terminate the new unique string properly 

    printf("%s -> %s\n", redundant, unique); 

    return 0; 
} 

대신 두 번째, 내부 루프 : 이제 OUTPUT

% ./a.out 
warning: this program uses gets(), which is unsafe. 
aardvark 
aardvark -> ardvk 
% 

의 단순화 및 코드 속도를 높이기 위해 일부 공간을 낭비 다른 접근 방법을 살펴 보자 2,813,210

이미 복사 되었으면 문자가 처리되었는지 여부를 결정하기 위해 문자가 색인 인 플래그 배열 (boolean)을 사용합니다.

대소 문자를 다르게 처리할지 아니면 하나를 접으셔야할지 생각해 보는 것이 좋습니다.

관련 문제