2012-02-25 4 views
0

내 할당을 위해 C++로 코드를 프로그래밍하려고합니다.배열에 여분의 데이터가 저장되는 이유는 무엇입니까?

내 주 및 기능에서 일부 데이터를 받아 들여야하는 부분 중 하나는 main에서 보낸 배열의 첫 번째 부분을 가져 와서 함수의 배열에 넣어야한다는 것입니다.

 for (int i = 0; i <= strlen(main) && exit == 0; i++){ 
     if (main[i] != ';' || main[i] != '\0'){ 

     keyword[i] = data[i]; 
     if(main[i] == ';' || main[i] == '\0') 
     exit = 1; 

     } 

라는 배열의 코드 main = "Hello World;Yes;No;Okay;Good Bye",

그래서 난 내 배열 Hello Worldkeyword라는 것을 저장할 것입니다 일어나고 난 후 여분의 데이터를 참조 키워드 문자열을 printf를하면 문제가 무엇인지 단어 Hello World 여기

내가 printf와

Your keyword-----> 'Hello World;? ' Actual keyword---> 'Hello World'

에있는 것입니다

내 논리 사용에 문제가 있습니까?

감사

+0

나는 코드의 나머지 부분은 확실하게 볼 것이다,하지만 내 생각 엔'keyword'는'숯불 *'(보다는, 예를 들어,'표준 : string') 때문이다 이 경우 for-loop가 끝날 때'keyword '끝에 "\ 0"을 하나 추가해야합니다. – jogojapan

+0

나는 정말로 당신의 질문을 이해하지 못했지만 break 키워드를 사용하여 ';'문자를 만나면 for 루프를 종료 할 수 있습니다. 키워드에 'hello world'가 포함되도록 – Pramod

+0

@Pramod break; 내 과제에서 허용되지 않는 이유는 루프를 깨기 위해 exit 변수를 사용하는 이유입니다. – Ali

답변

2

i <= strlen(main)i < strlen(main)에 대한 요구와 if에서 추가 종료 문자 확인이 필요 없다. 또한 필요한 데이터를 복사 한 후 keyword이 null로 끝나야합니다 (\0).

대상을 복사 할 수있을만큼 충분히 크다고 가정하면 아이디어를 얻을 수 있습니다.

for (int i = 0; i < strlen(main) ; i++) 
    if (main[i] != ';'){ 
     keyword[i] = data[i]; // Copy the characters until `;` isn't found 
    } else { 
     keyword[i] = '\0' ; // If `;` found, null terminate the copied destination. 
     break; 
    } 
} 
+0

'당신의 키워드 -----> 'Hello World ;?' 실제 키워드 ---> 'Hello World'' – Ali

+1

업데이트를 확인하십시오. – Mahesh

+1

이것은 논리를 훨씬 단순하게 만드는 최선의 해결책입니다. 나는 이것을 생각하려고 했었지만 정말로 생각하고 있었고, 단순한 것을 생각하지 못했습니다 .... 고마워요! – Ali

1

표시되는 여분의 데이터는 아마도 null 종료 문자입니다. 당신이

i <= strlen(main) 

를 사용하는 주 그래서 이것은 실제로 모든 문자와 널 종료를 인쇄합니다. 당신은 더 나은 당신이 무엇을 이해하기 위해 일반적으로

i < strlen(main) 

로 변경해야합니다, 좀 더 코드는 정말 도움이 될 것입니다.

if(main[i] != ';' && main[i] != '\0') 
+0

@Begemoth에 대한 코멘트를 참조하십시오. 일부 데이터에는';; ''이 전혀 포함되어 있지 않기 때문에'||'을 사용해야합니다 : – Ali

1

if (main[i] != ';' || main[i] != '\0') 

항상 사실이다 조건, 당신이 경우 테스트 할 :

그러나 begemoth 같은

은 당신이 원하는 무엇을 당신의 경우() 테스트를해야한다고 표시했다 그 성격은 ';'이 아니다. '\ 0'이 아니므로 && 연산자 ( and)가 아닌 || ( or)으로 테스트를 연결해야합니다.

일부 노트 :

  1. strlen 함수가 문자열의 길이를 결정하거나 *main[i]로 시험을 대체하기 위해 루프 전에 한 번 호출하는 것이 좋습니다 O (N) 복잡도를 갖는다.

  2. exit 변수가 중복되면 break을 사용하십시오.,

+0

글쎄요.'' ; "또는"\ 0 "때문에 데이터의 일부가''; ''을 가지지 않기 때문에이 경우에'||'를 사용해야하는 이유는 무엇입니까? – Ali

+0

@Ali, main [i] == ';' 'main [i]! ='; ''가 '0'이고, main [i]! = '\ 0''이 1과 같고'0 || 1 '은 1입니다. main [i] =='\ 0 ''이라면 같은 이유가 적용됩니다. 당신의 상태는 항상 사실입니다. – Begemoth

+0

그럼에도 불구하고 begod는 정확합니다. 자연 언어에서는 OR이라고 말하지만 불리언 논리로 시도하십시오. 너의 머리에 조금만 체크하면, 너는 이해할 것이다. Btw Ali 이것은 많은 사람들의 코드에서 가장 자주 발생하는 버그 원인 중 하나입니다. 이 부울 조건을 오해하고 || && – Lefteris

관련 문제