2017-12-19 2 views
0

내 C 코드의 문제점을 이해하는 데 도움이 필요합니다. 문자 반복없이 주어진 문자열 내에서 가장 긴 하위 문자열을 찾으려고합니다.런타임 오류 메시지 : 17 행 : 'int [256]'유형의 인덱스 -3 초과

런타임 오류 메시지 : 행 17 : leetcode 플랫폼에서 실행하면, 아래의 코드는 문자열 "amqpcsrumjjufpu" 나에게 오류를 제공 인덱스 -3 유형의 범위를 벗어 'INT [256]'

그러나 내 컴퓨터 또는 온라인 편집기에서 실행할 때 동일한 코드가 올바르게 작동합니다. 이 행동 차이를 이해하도록 도와주세요.

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

int lengthOfLongestSubstring(char* s) { 
    char *h = s; 
    int A[256] = {0}; 
    int length = 0; 
    int temp = 0; 
    int max = 0; 

    int len = strlen(s); 

    for(int i = 0; i < len;i ++){ 
     int A[256] = {0}; 
     length = 0; 
     h = s + i; 
     for(int j = i; j < len-1; j++){ 

      if (A[h[j]] == 1) { 
       break; 
      } else { 
       A[h[j]] = 1; 
       length +=1; 
      } 

      if (max < length) { 
       max = length; 
      }     
     } 
    } 

    return max; 
} 


int main() {   
    char *s = "amqpcsrumjjufpu"; 
    int ret = lengthOfLongestSubstring(s); 
    printf("SAURABH: %d",ret); 
} 
+1

분명히 어떤 시점에서 배열의 색인 -3에 액세스하려고합니다. 디버깅을해야합니다. –

+0

'char'는 서명 된 타입이므로 문자 0xFC는 -3으로 해석됩니다. 'uint8_t * h = (uint8_t *) s;' –

+0

@Saurabh dubey 형식 char cab는 signed char 또는 unsigned char로 동작합니다. 따라서 명시 적으로 h [j] 표현식을 unsigned char 유형으로 변환해야합니다. 예를 들어, A [(unsigned char) h [j]] = 1; –

답변

0

고유 한 문자 중에서 가장 긴 부분 문자열의 길이를 찾는 함수를 작성하려고합니다.

은 우선 함수는

int A[256] = {0}; 
//... 
int temp = 0; 

이 중복 기능의 외부 범위

size_t lengthOfLongestSubstring(const char *s); 
^^^^^^       ^^^^^ 

이 선언과 같은 선언해야합니다. 변수는 함수에서 사용되지 않습니다.

유형 charsigned char 유형 또는 unsigned char 유형으로 작동 할 수 있습니다. 그래서이 A[h[j]] 같은 표현에서 당신은 예를

A[(unsigned char)h[j]] 

내부 루프로 유형 unsigned char에 명시 적 지표로 사용되는 문자를 캐스팅해야

for(int j=i;j<len-1;j++){ 
하나 개의 문자를 포함하는 문자열을 실행하지 않습니다

. 그래서 그것이 쓰여지는 것처럼 말이되지 않습니다.

 if (max < length) { 
       max = length ; 
      } 

가 필요로 문이 내부 루프 외부에 배치되는이 경우

.

당신이 사용하는 알고리즘은 다음과 같은 방법을 구현할 수있다

#include <stdio.h> 
#include <limits.h> 

size_t lengthOfLongestSubstring(const char *s) 
{ 
    size_t longest = 0; 

    for (; *s; ++s) 
    { 
     size_t n = 0; 
     unsigned char letters[UCHAR_MAX] = { 0 }; 

     for (const char *p = s; *p && !letters[(unsigned char)*p - 1]++; ++p) ++n; 

     if (longest < n) longest = n; 
    } 

    return longest; 
} 

int main(void) 
{ 
    char *s = "123145"; 

    printf("The longest substring has %zu characters.\n", 
     lengthOfLongestSubstring(s)); 

    return 0; 
} 

프로그램 출력은

The longest substring has 5 characters. 
+0

설명해 주셔서 감사합니다 Vlad. 도움이되었다. –

0

귀하의 코드가이 범위를 벗어난 데이터를 읽기 때문에, 사용자의 입력 문자열이 입니다 가정 추락 amqpcsrumjjufpu 길이가 15이고 바깥 쪽 루프가 i = 13입니다.

h = s + i; // h was updated to indicate to 13th element of s 
,

및 첫 번째 반복에 대한 내부 루프에서이 소자를 판독 (j는 == 난 == 13)

A[h[j]] 

그래서,이 소자 A[*(h+j)]를 읽으려고하지만 h는 (S)의 13 원소에 나타낸다 그리고 지금이 값에 13을 더하려고하면, s의 26 번째 위치를 읽고 싶다면, s 문자열 범위를 벗어났습니다.

+0

알았어. 도움이 됐어. 감사 :) –

0

감사합니다. Vlad의 코드가 모든 테스트 케이스에 적용되었지만, 여기에는 Vlad와 rafix가 제안한 변경 사항을 모두 통과 한 모든 테스트 케이스를 통과 한 코드가 있습니다.

int lengthOfLongestSubstring(char* s) { 
    char *h = s; 
    int max = 0; 

    int len = strlen(s); 
    if (len == 1) { 
     return 1; 
    } 

    for(int i = 0; i < len;i ++){ 
     int A[256] = {0}; 
     int length = 0; 
     for(int j = i; j < len; j++){ 

      if (A[(unsigned char)h[j]] == 1) { 
       break; 
      } else { 
       A[(unsigned char) h[j]] = 1; 
       length +=1; 
      } 

     } 
     if (max < length) { 
       max = length; 
      } 
    } 

    return max; 
}