2017-04-17 8 views
1

그래서 내가 입력하는 프로그램을 작성해야 SMILEC에서 공백 다음 문자를 읽는 방법?</p> <p><strong>봄 마일 인디 거짓말 자아</strong></p> <p>및 결과가 될 것입니다 :

을하지만 입력 몇 가지 문제를 가지고 . 나는 입력의 길이를 모르기 때문에 어떤 길이라도 될 수있다.

그래서 scanf를 사용하여 모든 단일 문자를 읽습니다. 나는 필요한 문자를 저장할 배열의 크기를 알기 위해 공백을 셉니다.

다음은 내 주요 문제입니다. 공간을 찾으면 scanf에서 읽은 다음 문자를 저장해야하지만 어떻게 할 수 있습니까? 혹시이 문제를 해결하기위한 다른 방법을 알고 있습니까?

여기에 지금까지 내 코드입니다 :

int main() 
{ 

    char ch; 
    int i = 0, count= 0; 

    while(scanf("%c", &ch) != EOF) 
    { 
     if(ch == '\n') 
      count = 0; 

     if(ch == ' ') 
      count++; 

     char array[count+1]; 

     if(ch == ' ') 
     array[i++] = ch + 1; // I tried this, but it doesn't work. 
    } 
    return 0; 
} 
+2

다음 문자를 읽어야합니다. 당신은 이미 캐릭터를 읽는 법을 알고 있기 때문에 .... 나는 그 문제가 무엇인지 모르겠다. –

+0

'array' 선언문을 루프 밖으로 옮겨야합니다. 여러분이 가지고있는 방식대로, 문자가 공백이 아닌 한 첫 번째 반복에서 요소가 0 인 배열로 만들어집니다. – ryyker

+0

나는 그것을 얻는다. 그러나 만일 내가 고리에서 선언하면 나는 그 크기를 어떻게 알 수 있냐? 줄이 얼마나 길기 때문에 나는 모릅니다. 그래서 카운터를 사용하여 공간마다 첫 번째 문자를 저장하기위한 배열의 완벽한 크기를 선언합니다. – Kynthia

답변

1

while 루프에서 char 배열을 정의하면 배열을 사용할 수 없습니다. while 루프가 10 회 실행되면 코드는 10 자의 배열을 정의하지만 while 루프 done 후에 사용할 수 있습니다. 코드

int main() { 
    char ch; 
    char array[1024]; 
    int i = 0, count= 0; 
    int status = 1; 
    while(scanf("%c", &ch) != EOF) { 
     if(ch == '\n') { 
      break; 
     } 
     if(ch == ' ') { 
      status = 1; 
      continue; 
     } 
     if (status == 1) { 
      status = 0; 
      array[i++] = ch; 
     } 
    } 
    array[i++] = ' '; 
    printf("%s", array); 
    return 0; 
} 

내 코드는 다른 입력 something.So malloc에 ​​아마 당신을 도와 전에 배열의 길이가 1024.We 이하 길이가 입력의 길이를 알 수없는 것이라는 가정에 기초한다. Malloc은 C의 함수입니다. 메인 메모리를 관리하는 데 사용할 수 있습니다.

+0

1) array [i ++] = '\ 0'; '을 원 했습니까? 2)'while (i <1023 && scanf ("% c", & ch)! = EOF) {'는 코드 악용을 방지합니다. – chux

+0

왜 루프 뒤에 배열에 공백을 추가합니까? – Pharaoh

+0

@Pharaoh는 단지 – user3801359

1

chchar이다. 문자 "space"에 숫자 1을 추가하는 것은 의미가 없습니다. 대신 문자열에서 다음 문자를 읽어야합니다. 당신은 그렇게 할 수 있습니다 :

int main() 
{ 

    char ch; 
    bool had_space; 
    int i = 0, count= 0; 

    had_space = true; 

    while(scanf("%c", &ch) != EOF) 
    { 
     if(ch == '\n') 
      count = 0; 

     if(ch == ' ') 
      count++; 

     char array[count+1]; 

     if(ch == ' ') 
      had_space = true; 
     else if (had_space) 
      array[i++] = ch; 
    } 
    return 0; 
} 

나는 또한 당신이 루프 밖에서 배열을 정의해야 할 것 같아요.

+3

* 문자 "space"*에 1을 더할 수 없습니다. 물론 가능합니다. –

+0

그리고이 작업의 결과는 무엇입니까? 편집 : 글쎄, 좋아, 다음 ASCII 문자를 얻을 것 같아요. 나는 "그것은 이해가되지 않는다"라고 써야했다 - 나는 그것을 바꿀 것이다. – Pharaoh

+1

@Pharaoh 완벽하게 이해하고 의견에 설명해 주셨습니다. ASCII 차트는 결정적입니다. – nicomp

0

입력이 정말로 불분명하고 포함 할 공간의 수를 모를 경우 동적 메모리 할당이 필요합니다. 즉, 메모리를 할당하려고 시도하는 대신 필요에 따라 메모리를 할당해야합니다. 스택에 고정 된 크기의 메모리 조각. 이것에 대해 몇 가지 방법이 있지만 단순한 연결 목록이 가장 깨끗하다고 ​​생각합니다.

typedef struct linkedListNode { 
    char    ch; 
    struct linkedList * next; 
} linkedListNode_t; 

linkedListNode_t *pHead = NULL; 
linkedListNode_t **ppNext = &pHead; 

// pHead points to the first node in the list 
// ppNext points to the pointer to the next element in the list 


while(scanf("%c", &ch) != EOF) { 
    if (ch == ' ') { 
     // scan next character, and add to linked list: 
     if (scanf("%c", &ch) == EOF) 
      break; // exit loop if we've hit end of input 
     // ch is ok -- add to list: 
     // allocate a new pNode to store the information 
     linkedListNode_t *pNode = malloc(sizeof(linkedListNode_t); 
     if (pNode == NULL) { 
      printf("Out of memory -- aborting"); 
      exit (-1); // if allocation failed, abort program 
     } 
     pNode->ch = ch; 
     pNode->next = NULL; 
     *ppNext = pNode;  // make previous node point to this one. 
     ppNext = &pNode->next; // update ppNext 
    } 
    else if (ch == '\n') { 
     // special handling of newline -- did you want to print the 
     // string and dump memory here?   
    } 
} // end wile loop 

// at this point we have a linked list with all characters that 
// follow spaces -- print it out: 
linkedListNode *pNode = pHead; 

while (pNode != NULL) { 
    printf("%c", pNode->ch); 
    pNode = pNode->next; 
} 
printf("\n");  

// free list: 
pNode = pHead; 
linkedListNode *pNext; 
while (pNode) { 
    pNext = pNode->pNext; 
    free(pNode); 
    pNode = pNext; 
} 

면책 조항 : 나는 위의 테스트를하지 않은, 그래서 내가 구문 오류를 만들 가능성이 당신이 필요로 어떻게해야 다음과 같습니다. 어쨌든, 당신은 C에서 약간 새로운 것으로 보이기 때문에, 어떻게 작동하는지 이해하기 위해 이것을 추출 할 것을 강력하게 제안 할 것입니다.