2015-01-12 3 views
-1

누군가가 올바른 방향으로 나를 안내 할 수 있습니까? C (코드 오류) 문자열에서 단어 순서 반전

난 그냥 캔트에 오류를 찾을 수가 학교 과제이다. 입력을 위해 내가 얻을

"a b c d e f" 

"f e d c b a" and that is right. 

그러나

"1234567890 abcdefghij" i get 

"�' abcdefghij 1234567890" 

에 대한 수 누군가 올바른 방향으로 나를 인도합니까? 포인터가 모두 잘못 되었습니까? 잠재적으로 쓰레기를 잡아 수 있습니다 그래서 i이 단어의 마지막 작성 인덱스에 1 자리 높은 것으로

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

int main() 
{ 
    char *words [100]; 
    char *word[11]; 
    char *str; 
    int res, i; 
    i = 0; 
    res = scanf("%10s",word); 
    if (res != 1) return 0; 

    while (res != EOF) { 
    str = malloc(strlen(word)+1); 
    strcpy(str,word); 
    words[i] = str; 
    res = scanf("%10s",word); 
    i = i+1; 
    } 

    while (i>=0) { 
    printf("%s ",words[i]); 
    i--; 
    } 

    return 0; 
} 
+0

'char word [11];을 시도해라. – molbdnilo

+1

코드를 컴파일하려고 할 때 경고 화면과 구문 오류가 발생합니다. 당신의 컴파일러가 말하는 것을 들어 봤어? – 5gon12eder

+0

들여 쓰기를 수정하십시오. 그것은 내 눈을 아파요 – DrKoch

답변

1

문제입니다. i = i+1;

사용 :

if (res != EOF) i = i+1; 
2

i 개시 어레이의 끝을지나 밖으로 소자 (1) 대신

. 첫 번째 예제가 효과가 있다고 생각되는 것은 이상합니다. 두 번째는 그렇지 않다는 것은 놀라운 일이 아닙니다.

시도 :

while (--i >= 0) 
{ 
    printf("%s ", words[i]); 
} 

wordchar word[11]하지 char *word[11]해야한다.

+0

도움 주셔서 감사합니다. 몇 가지 이유 때문에 * (아마도 일부 버그)를 사용할 때 cloudcoder 인터페이스는 내 출력 만 허용합니다. –

0

문제는 인쇄물 loop입니다.

while (i>=0) { 
    printf("%s ",words[i]); 
    i--; 
} 

당신이 i의 가치는 당신에게 words 배열에서 초기화되지 않은 요소를 줄 것이다,이 루프를 시작 이런 식

while (i > 0) { 
    printf("%s ", words[--i]); 
} 

참고 변경

: 당신이해야 또한 free 포인터를, 그래서 단어 수를 겹쳐 쓰지 마십시오. ilustrative 용도로만 사용하는 경우에도 괜찮습니다.하지만이 작업을 수행해야한다고해도

while (i > 0) { 
    char *currentWord = words[--i]; 
    printf("%s ", currentWord); 
    free(currentWord); 
} 
+0

도움을 주셔서 대단히 감사합니다! 인쇄 루프를 수정 한 후 작동했습니다. –

+0

@ SnæbjörnValurLilliendahl 나는 당신이 받아 들인 응답이 없다는 것을 본다 [this] (http://stackoverflow.com/tour) –

1

strrev(str) 함수를 사용하여 str을 뒤 바꾸는 이유는 무엇입니까? 나는 쉬운 방법이라고 생각한다.

+1

팁과 그것의 좋은 것을 주셔서 감사하지만 어떤 기능을 사용하도록 허락되지 않았다. –

+0

FredMensah는'string.h' 헤더의 사용을 금지하는이 숙제에서 꽤 일반적입니다. 또한'strrev()'는 표준이 아닙니다. –

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

/*function splits a string into an array of words, returns the array and its actual dimension*/ 
/*------------------------------------------------------------------------------------------*/ 
char **StringToWords (char *buf, int &dim, int NW, int LW) 
{ 
    char **words = (char**) malloc (NW*sizeof(char*)); 
    int i = 0; 
    for (; i<NW; i++) 
     words[i] = (char*)malloc (LW*sizeof(char));  

    i = -1; 
    char *delims = " ,.-"; 
    char *pch = strtok (buf, delims); 
    while (pch != NULL && i<NW) 
    { 
     strcpy(words[++i], pch); 
     pch = strtok (NULL, " ,.-"); 
    } 
    dim = i+1; 
    return words; 
} 

void DestroyWords (char **words, int NW) 
{ 
    for (int i = 0; i<NW; i++) 
     free (words[i]); 
    free (words); 
} 

/*--------------------------------------------------------------------------------------------*/ 
int main() 
{ 
    int NW = 100; /*maximum number of words*/ 
    int LW = 50; /*maximum length of a word*/ 

    char buf[BUFSIZ]; 
    printf("Your string:\n"); 
    gets(buf); 

    int dim = 0; 
    char **words = StringToWords (buf, dim, NW, LW); 
    printf("Reversed string:\n"); 

    int i = dim; 
    while (--i >-1) 
     printf("%s ", words[i]); 

    DestroyWords (words, NW); 
    getchar(); 
    return 0; 
} 
/*--------------------------------------------------------------------------------------------*/