2012-01-14 1 views
3

문자 배열로 C에서 문자열로 작업하고 있는데 for 루프에 값을 동적으로 전달할 수 있도록 노력하고 있습니다. C 루프가 작동하지 않습니까?

다음 코드 작품

, 문제 :

for (int i = -strlen(fragments[2]) + 1; i < 11; i++) { 
    int test = OverlapStrength(fragments[1], fragments[2], i, 0); 
    printf("%d\n", test); 
} 

을하지만, 어떤 이유로,이 코드는 아무 것도 인쇄되지 않습니다 : 사실

for (int i = -6; i < 11; i++) { 
    int test = OverlapStrength(fragments[1], fragments[2], i, 0); 
    printf("%d\n", test); 
} 

,이 코드도 작동하지 않습니다

for (int i = -strlen(fragments[2]) + 1; i < strlen(fragments[1]); i++) { 
    int test = OverlapStrength(fragments[1], fragments[2], i, 0); 
    printf("%d\n", test); 
} 

나는 -strlen(fragments[2]) + 1strlen(fragments[1])의 값을 th 바로 전에 확인했습니다. e 루프가되어 각각 -6과 11을 체크 아웃합니다. 분명히 루프는 그 값을 직접 장소에 넣을 때 작동하지만, 두 번째 것은 strlen 계산으로 대체하면 끊어지며 왜 저의 삶에 대한 이유인지 알 수 없습니다. 도움? 내가 그들을 변경할 수 있도록

편집

OverlapStrength는 상수로의 인수를, 그래서 내가 가서 내가 조각을 변경 아니에요 확신 해요. 다음은 메소드 선언의 : 조각의

int OverlapStrength(const char one[], const char two[], int startOne, int startTwo) 

내용은 중요하지 않을해야하지만, 그들은 단순히 내가 중복 조각에서 다시 함께 조각 시도하고 문자열입니다. 나는 이미 내 파편들이 모두 제대로 나오고 있는지, 그리고이 루프를 선언하지 않은 상태에서 길이가 제대로 계산되었는지 확인했다.

+6

가''나 strlen (조각 [1])'의 값을 변경 OverlapStrength' 않습니다에 strlen 캐스팅 할 수 있습니까? –

+0

OverlapStrength의 인수는 정수로 선언되므로 특별히 변경할 수 없습니다. 해당 코드를 표시하기 위해 원래 게시물을 편집하십시오. – Chiubaka

답변

4

strlen 반환 값, 아마 당신의 사건에 대한 unsigned int에 대한 형식 정의입니다 :

는 상수를 사용하여이 문제를 해결합니다. 그런 다음 signed int ( i)과 unsigned int ( strlen(...))을 비교합니다. C는 서명 된 값을 부호가없는 유형으로 변환하기로 결정합니다 ( default type promotions 때문에). -6을 부호없는 int로 변환하면 4294967290이되므로 비교가 거짓이므로 루프가 끝납니다.

는이 문제를 해결하려면, 당신은 예를 들어 서명 값, 예컨대 :

i < (int) strlen(fragments[1]) 
+0

아! 좋아, @ Femaref의 대답은 효과가 있었지만, 실제로 나에게 이유를 설명했다. 그건 의미가 있습니다, 나는 그렇게 생각하지 않았습니다. 감사! – Chiubaka

+0

리오리, 맞습니다. 그것을보아야 만합니다. 일반적으로 나는 그 캐스트를 탐지하는데 능숙합니다. – Femaref

0

for 루프에서 코드 분할 (i < strlen(fragments[1]) 부분)은 모든 반복에서 평가됩니다. OverlapStrengthfragments[1]의 값을 i보다 작게 변경하면 루프가 중단됩니다. 유형 size_t

int loopUntil = strlen(fragments[1]); 
for (int i = -strlen(fragments[2]) + 1; i < loopUntil; i++) { 
    int test = OverlapStrength(fragments[1], fragments[2], i, 0); 
    printf("%d\n", test); 
} 
+1

제 생각에'OverlapStrength'는 전혀 실행되지 않습니다. 내 대답을보십시오. 그러나 실수로 strlen을 int로 변환하여이 문제를 해결할 수도 있습니다. – liori