2013-05-18 4 views
-1

나는 모든 단어 집합을 알파벳으로 인쇄하는 프로그램을 작성하려고합니다. 이것은 주로 C에서 문자열과 포인터에 익숙해 지도록하는 테스트입니다. 재귀 적 솔루션에 정착했습니다. strcat에서 포인터를 사용하는 데 문제가있는 것처럼 보입니다. 왜 내가 여기에 segfaults를 얻게 될지 제안 해 주시겠습니까?알파벳으로 모든 단어 집합을 C로 인쇄하십시오

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

    #define DIM 26 

    void print (char *); 

    char alphabet[26] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 
        'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'}; 
    char word[26]; 


    int main(void) { 
     *word = '\0'; 
     print(word); 
     return EXIT_SUCCESS; 
    } 

    void print (char *word){ 
     for (int i = 0; i < DIM; ++i){ 
      strcat(word, alphabet[i]); 
      printf("%c\n", word); 
      print(*word); 
     } 
    } 
+1

'strcat'는 두 번째 인수로 문자열을 가져오고, char을 부여합니다. 적절한 편집이 당신에게 이것을 말해 줬을 것입니다. 예를 들어, gcc에서'-Wall'을 시도해보십시오. – Shahbaz

+1

얼마나 많은 단어가 될지 깨닫고 있습니까? 잠시 인쇄 할 수 있습니다. –

+0

코드가 컴파일되지 않습니다. 1. strcat는 문자가 아닌 두 번째 인수로 문자열을 가져옵니다. 2. print는 문자가 아닌 인수로 문자열을 가져옵니다. 3. printf의 % c는 문자열이 아닌 char을 얻습니다. – kotlomoy

답변

0
  • strcat의 두 번째 인수는 문자열 이다. 그래서 의 널 종료 배열을 보내야합니다.
  • printf 의 포맷은 %cint 나타내지 만 wordchar 포인터이다.
+0

코드에서 유일한 문제는 아니지만 strcat을 사용하면 문제가 발생했습니다. 감사! – shockstakovich

1

내가 생각하는 가장 깊은 개념 문제는 기본 사례가 없다는 것입니다. 당신은 무한 재귀 트리를 만들고 있습니다.

이 시도 : 좋은 컴파일러에 데리러 C의 사용량 다른 작은 문제가 있습니다

void print (char *word){ 
     if (strlen(word)<5){ 
      for (int i = 0; i < DIM; ++i){ 
       strcat(word, alphabet[i]); 
       printf("%c\n", word); 
       print(*word); 
      } 
     } 
    } 

. 경고를 켜고 무시하지 마십시오!

+0

어디에서 제안합니까? 컴파일 할 때 -Wall과 함께 이맥스를 사용하고 있습니다 ... – shockstakovich

0

버퍼가 너무 짧기 때문에 (26 자 및 종료 0의 경우 27 바이트 필요) 2. strcat()은 문자열을 원하며 char을 입력하고 3. 함수에 무한 재귀가 있고, 절대로 종결되지 않습니다.

더미 반복적 인 대체 솔루션 : 모든 부분 집합 = 반복과 변화, 그리고 2^n 부분 집합이 있습니다 : 천만에요

char abc[26] = { 
    'a', 'b', 'c', 'd', 
    'e', 'f', 'g', 'h', 
    'i', 'j', 'k', 'l', 
    'm', 'n', 'o', 'p', 
    'q', 'r', 's', 't', 
    'u', 'v', 'w', 'x', 
    'y', 'z' 
}; 

for (long i = 0; i < (1 << 26); i++) { 
    for (int j = 0; j < 26; j++) { 
     if ((i >> j) & 1) { 
      fputc(abc[j], stdout); 
     } 
    } 
    fputc('\n', stdout); 
} 

은.

0

단어 길이가 27 바이트이고 마지막 바이트를 0으로 설정해야합니다.

그렇지 않으면 printf가 소유하지 않은 메모리로 오버런됩니다. printf는 0 바이트 값이 될 때만 종료됩니다.

인쇄 기능도 무기한으로 호출합니다. 이렇게하면 스택 오버플로가 매우 빠르게 발생합니다.

관련 문제