2012-01-05 2 views
-2

누군가 내가 이것을 설명 할 수 있는지 궁금한가요? 나는 사용자에게 문장을 입력하도록 요구하는 프로그램을 가지고있다. 그런 다음 프로그램은 사용자 입력을 배열로 읽어 들이고 모든 모음을 $ 기호로 변경합니다. 내 질문에 대한 루프 어떻게 작동합니까? char c = 0을 초기화 할 때; 배열 요소가 int임을 의미하지 않습니까? 나는 그것이 어떻게 기능 하는지를 이해할 수 없다.C 배열을 통해 반복하기

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

int main(void) 
{ 
char words[50]; 
char c; 

printf("Enter any number of words: \n"); 
fgets(words, 50, stdin); 

    for(c = 0; words[c] != '\n'; c++) 
    { 
      if(words[c] =='a'||words[c]=='e'||words[c]=='i'||words[c]=='o'||words[c]=='u') 
      { 
       words[c] = '$'; 
      } 
    } 
printf("%s", words); 

return 0; 
} 
+0

'c'와 'words [c]'는 완전히 다른 것입니다. 그리고'c'를'char'라고 정의했기 때문에, 상한값이 50 대신에 500이라면이 코드에서 어떻게 될 것이라고 생각합니까? –

답변

3

코드는 C에서 (정수 변수 c 취급 인 정수). 내 견해로는 이것을 int (아마 unsigned int)으로 선언하는 것이 더 낫습니다. 그러나 words 길이가 최대 50자인 경우 char c이 정상적으로 작동합니다. 루프에 관해서

:

  1. c = 0 0으로 초기화 c.
  2. words[c] != '\n' - 시작시와 반복 할 때마다 - 현재 문자 (words[c])가 개행 문자인지 여부를 검사합니다.
  3. c++ 각 반복 후에 c이 증가합니다.

    그것은 만약에 컴파일 된 머신의 가장 작은 단위로 정의된다 short, int, longlong long있다 (많은 다른 유형)로

+0

그래서 루프를 실행하기 위해 별도의 int 변수를 선언해야합니다. 즉 char c를 남겨두고 int i = 0; 내 루프에서 c를 i로 바꿉니 까? – adohertyd

+0

@adohertyd : 네, 이것이 제가 할 일입니다. 나는 더 이상 필요하지 않을 것이기 때문에'c'를 버릴 것이다 (단지 루프 카운터로 사용된다). – NPE

+0

좋아, 그래서 난 int로 변경하고 루프는 동일하게 작동합니다. 더 정확한가? char 변수에 대해서도 항상 int 변수를 사용해야합니까? – adohertyd

0

은 정말 charint 암시 적으로 변환되는 것은 아닙니다.

이 경우 char을 작은 숫자 int으로 볼 수 있습니다. sizeof(char) == 1이므로 int보다 작습니다. 아마도 그 이유 때문일 수 있습니다. 프로그래밍 방식으로 입력 문자열이 매우 길지 않은 한이 경우에는 차이가 없습니다.이 경우 int 전에 char이 오버플로됩니다.

+0

그래서 당신은 char c = 0; for 루프의 컨텍스트로 인해 int로 변환됩니까? – adohertyd

+0

흠 ... 실제로 그들은 거기에서 변환되지 않습니다. 'operator [] '를 사용하면 변환이 일어날 수 있습니다. 모든 유형을 반복자로 사용할 수 있으며 제한이 없습니다. 그리고 char을 int로 직접 변환 할 수 있고, 그 반대도 가능하므로 char c = 0은 int를 char **로 변환합니다. –

0

숫자 리터럴 (예 : 0)은 char 유형의 변수와 호환됩니다. 사실 작은 따옴표로 묶인 문자 리터럴 (예 : '\n')은 int 유형이지만 할당되거나 다른 char과 비교 될 때 암시 적으로 char으로 변환됩니다.

숫자 리터럴은 문자의 범위를 초과하지 않는 한 문자 리터럴과 호환됩니다.

는 컴파일러 경고 발생한다 다음이 반면

char c = 257; 

되지 않습니다

char는 기본적으로 매우 좁은
char c = 127; 
0

char는 C되고 일체형이고 일반적으로 8 비트로되어 -128에서 127까지의 값을 가질 수 있습니다. 부호없는 문자는 0에서 255까지의 값을 가질 수 있습니다.

50 전에 항상 멈추고 반복자로 작동합니다. 최대 127 개의 값을 보유 할 수 있습니다.int 타입은 일반적으로 2,147,483,647까지의 값을 가질 수 있지만 머신의 공간을 8 비트 char로 4 배 차지합니다. int는 부호없는 int에 대해 -32,768 ~ 32,767 또는 0 - 6,5535 사이의 값을 의미하는 C에서 최소 16 비트만이 보장됩니다.

루프는 처음 문자를보기 위해 words[0]과 같이 배열의 요소에 액세스하는 것입니다. 그런 다음 words[1]을보고 다음 문자를 봅니다. 당신이 char을 사용하고 있기 때문에 나는 그것을 매우 공통적으로 사용하고 있다고 가정합니다. 문자열이 127 이상이 될 때까지 반복문을 저장하는 데 char가 충분할 것입니다. 127 자 (50 개가 아닌) 이상을 읽고 Char를 사용하면 반복 할 char을 사용할 수 없으므로 이상한 문제가 발생합니다. 128을 유지하고 -128로 돌아갈 것입니다. Segmentation Fault가 발생할 가능성이 높은 words[-128]에 액세스 할 수 있습니다.

1

배열은 건물과 비슷하지만 각 층마다 숫자가 있습니다.

1 층에는 John이 살고 있습니다. 2 층에는 Michael이 살고 있습니다.

Jonh 아파트에 가고 싶다면 엘리베이터에서 1을 누르십시오. 마이클에게 가려면 2 번을 누르십시오.

배열과 동일합니다. 배열의 모든 위치에는 값 (이 경우에는 문자)이 저장됩니다.

모든 위치에는 색인이 연결되어 있습니다. 첫 번째 위치는 0입니다.

배열의 위치에 액세스하려는 경우 배열 [position]을 사용합니다. 여기서 액세스하려는 배열의 인덱스는 position입니다.

변수 c은 처리 할 위치를 보유합니다. [c]라고 말하면 배열의 c nt 위치에 액세스하여 그 값을 검색합니다.

Supose 단어는 단어 \n은 어레이의 최종 위치로 설정되어 상기 caracter의 끝을 결정하기 위해 ocool

word[1] 결과 c

word[0] 결과이다.