2014-12-27 2 views
1

getline 함수는 전체 입력 행을 스캔하여 주어진 char 배열에 저장합니다. getline 메서드를 사용하여 주어진 인덱스에서 시작하는 입력을 검색하려고한다고 가정합니다. 이것을 어떻게 할 수 있습니까?주어진 인덱스에서 시작하여 C에서 getLine()을 사용할 수 있습니까?

예를 들어, 입력이 다음과 같다고 가정 해 보겠습니다. 안녕하세요, 제 이름은 John입니다.

게이브 라인 만 저장하려면 내 이름은 존입니다.

char* cmd = NULL; 
    size_t size = 0; 

    getline(&cmd, &size, stdin); // code to get whole input line. 

는 당신에게는 fgets를 사용

+0

가져가 슬라이스 끝내십시오. – ChiefTwoPencils

+0

정확한 기능이 필요할 것으로 예상됩니까? –

+1

개인적으로 xxxbytes를 더미 버퍼로 읽었습니다. 그렇게하면 표준을 계속 사용할 수 있습니다 – technosaurus

답변

1

에는 이러한 기능이 없습니다. 그러나 기본 입력 스트림에서 읽으며 해당 스트림에서 읽는 다른 많은 함수도 있습니다.

가장 기본적인 읽기 기능 중 하나는 getc()입니다. 하나의 단일 문자를 읽습니다. 따라서 getline을 N 번째 문자에서 읽기 시작하려면 N 바로 앞에 getc을 사용합니다.

// "skip" N characters - read N and forget them immediatelly 
for(int i=0;i<N;++i) 
    getc(); // remember: that's a READ, it can FAIL 

getline(...); // remember: that's a READ, it can FAIL 

당연히 그런 식으로 건너 뛴 문자는 모두 복구 할 수 없습니다 (물론 거의 생략하겠습니다). 또한,이 방법 을 "뒤로 이동"할 수 없습니다. "전달"은 건너 뛸 수 있습니다.

입력 스트림의 문자를 되돌아 봐야하는 경우 버퍼링이 필요합니다. 버퍼의 전체 또는 일부를 읽어 버퍼 전체를보고 (데이터 배열 등), 버퍼에서 관심있는 부분을 잘라내어 버퍼에 새로운/다음 데이터를로드하는 등의 작업을 수행 할 수 있습니다. 버퍼가 좋다! :)

그러나이 읽기 - 하나 - 하나는 때때로 너무 좋습니다. 이 "건너 뛰기"방식의 주된 장점은 추가 메모리를 전혀 사용하지 않는다는 것입니다. 스킵 된 데이터가 수 킬로/메가 /../ 바이트와 같이 크다면 즉시 버퍼를 모두 버려서 즉시 버려두는 것은 정말로 낭비입니다.

+0

대단히 고마워요. – Bravo

1

당신이 입력으로 전체 라인을 얻을 수있는 기능을 감사드립니다. 그 후 위치 을 기반으로, 당신은 그것을 얻을 수 있습니다. 예를 들어

,

char arr1[20],arr[]="hi this is for testing"; 

strcpy(arr1,arr+10); // In this you can use the cmd for that. 

당신은 당신이 필요로 문자열을 얻을 것이다.

+0

이것이 정확하게 질문에 대답하는 것은 아니지만, 이것이 OP가 원했던 것이고 배우는 것이 사실이라는 것을 느낍니다. – quetzalcoatl

1

대답은 '아니오'입니다.

색인을 기반으로 읽으려면 getline()을 사용할 수 없습니다. 버퍼 포인터의 주소와 size 변수의 주소를 전달하면됩니다. 일단 라인을 읽으면 버퍼를 파싱하고 인덱스를 기반으로 필요한 것을 가져올 수 있습니다.

1

이 같은 크기와 별표 (*)를 지정하여 문자의 고정 된 수를 무시 fscanf를 사용할 수 있습니다 형식 문자열에

fgets(cin, "%*6[^\n]"); // Ignore the first six characters, or up to \n 
getline(&cmd, &size, stdin); // Read the rest of your string 

별표가 "읽기 무시"를 의미한다. Six는 읽을 문자 수를 지정합니다 (무시합니다).

+0

** i <6 {getc()}'에 대해 ** 모든 ** ** 단순한 것보다 낫지 않습니까? (당연히 \ n의 명백한 위반을 제외하고) – quetzalcoatl

+0

@quetzalcoatl 그것은 개인의 취향의 문제 다. 나에게 'for'루프가없는 거의 모든 것이 'for' 루프가있는 거의 모든 것보다 낫다. – dasblinkenlight

+0

흠 .. 생각해 보면 .. '6'이 컴파일 타임에 알려지지 않았다면 atoi/sprintf'ing과 'count'대 루프가 .. 내 선호가 아닐 것입니다. 하지만 여전히 유용한 트릭이 가방에 들어 있습니다! – quetzalcoatl

관련 문제