2014-10-04 2 views
1

대문자로 시작하는 문자열의 모든 단어를 골라 내고 싶습니다. 그러나 3 행에 범위를 벗어난 배열 오류가 나타납니다. 그냥 당신이 할 수있는 그래서 strWord.Length > 0대문자로 시작하는 모든 단어 선택하기

if (strWord.Length > 0 && Char.IsUpper(strWord[0])) 
{ 
    Console.Write(strWord + " :: "); 
} 

if (strWord.Length > 0 && Char.IsUpper(strWord[0])) 
+0

_ : 그러나

if (strWord.Length > 0 && Char.IsUpper(strWord[0])) ... 

, 당신은이 깔끔한 LINQ 쿼리를 사용할 수 있을까? 실제로 "경계 밖의 인덱스 예외"입니까? –

답변

4

스왑 인수 주셔서 감사합니다 strWord 헥타르 첫 글자를 얻으려고하기 전에 적어도 한 글자 이상.

2

을 :

foreach (string strWord in words) 
{ 
    if (Char.IsUpper(strWord[0]) && strWord.Length > 0) 
    { 
     Console.Write(strWord + " :: "); 
    } 
} 

검사 전에 그렇지 않으면 충돌, 당신의 도움이

1

여기서 일어나고있는 것은 strWord [0]의 값을 먼저 확인하지 않고 먼저 단어에 문자가 있는지 확인하지 않으므로 strWord 값이 NULL 인 경우 프로그램에서 인덱스 값이 주어지지 않았지만 인덱스 0이 호출되고 있다는 것을 제외하고는이 문제를 해결하기 위해 먼저 단어의 길이를 확인한 다음 문자열 strWord [0]이 대문자인지 아닌지 확인해야합니다. 조건이 파기 될 경우 두 번째 부분에 도달하기 전에 다음 NULL 인 정정 코드 1 -

if (strWord.Length > 0) 
{ 
    if(Char.IsUpper(strWord[0])) 
    { 
     Console.Write(strWord + " :: "); 
    } 
} 

정정 코드 2 -

1

인수가 순서대로 평가되므로 & & 연산자를 사용할 때 길이 검사가 첫 번째인지 확인하십시오. 첫 번째 인수는 두 번째는 실행되지 않습니다 실패하고 IsUpper 범위를 벗어날의 원인이되는 오류 길이가 0 일 때 경우

http://msdn.microsoft.com/en-us/library/2a723cdk.aspx

그래서 당신은 단지 주변의 평가를 교체해야합니다

if (strWord.Length > 0 && Char.IsUpper(strWord[0])) 
{ 
    //etc 
} 
1

&& -operator는 단락 회로 연산자로, 이미 false을 반환하는 경우 첫 번째 조건 만 평가한다는 점에 유의해야합니다. 따라서 예외를 방지하려면 올바른 선택입니다. 하지만 올바른 순서를 사용해야합니다. 먼저 검사가 실패 할 수 있습니다. 따라서이 같은

: _ "아웃 오브 바운드 배열"

var allWordsThatStartWithUpperCaseLetters = words 
    .Where(w => w.Length > 0 && Char.IsUpper(w[0])); 
string result = string.Join(" :: ", allWordsThatStartWithUpperCaseLetters); 
관련 문제