2017-03-16 1 views
0

그래서 메모리 할당을 통해 문자열을 기본적으로 만드는 프로그램을 작성하려고 해요, 문자 당 문자 읽기,하지만 키보드에서 한 입력을 통해서만. 나는 그것을하기위한 여러 가지 (더 좋은) 방법이 있다는 것을 알고 있지만, 나는이 특별한 방법으로 그것을하고 싶었다! 다음은 코드입니다 :malloc 및 getchar() 통해 문자열 만들기

int newstring (char** string) 
{ 
printf("--------------In function newstring--------------\n"); 
int i = 0; 
string = malloc (sizeof (char)); 
printf("Adress: %p\n", (void*)string); 
if (string == NULL) 
    return -1; 

while (1) 
{ 
printf("Pre-scan\n"); 
*(string[i]) = getchar(); 
printf("After-scan\nstring[%d] = %c\n", i, *(string[i])); 
i++; 
if (*(string[i-1]) == '\n') 
    break; 
printf("Reallocation to size %d\n", i+1); 
string = realloc (string, sizeof (char) * (i+1)); 
if (string == NULL) 
    return -1; 
} 

string[i-1] = '\0'; 
printf("--------------Exit function newstring--------------\n"); 
return; 
} 

int main() 
{ 
char *string; 
newstring (&string); 
printf("%s\n", string); 
} 

문제는 프로그램이 항상 3 문자를 읽기 전에 중간 충돌이다, 여기에서 발생한 printfs 있습니다

Adress: 00AE1578 
Pre-scan 
1st Input: >>Hello 
After-scan 
string[0] = H 
Reallocation to size 2 
Pre-scan 
After-scan 
string[1] = e 
Reallocation to size 3 
Pre-scan 

내가 때문에의인지 궁금 했었어요은 버퍼의 일종을 가지고 있지만 한계가 2 문자 (난 여러 입력을 시도했습니다, 항상 세 번째 문자 앞에 붙어 도착) 믿기 힘들 찾을 수 있습니다. 또한 "scanf ("% c ", * (string [i]))"같은 결과를 시도했습니다.

+0

당신은'free'를 호출하지 않습니다 - 프로그램은 메모리가 누출되어 메모리가 부족하기 때문에 결국 멈출 것입니다. – Dai

+0

@Dai realloc은 이미 할당 된 메모리를 해제하기 때문에 free를 호출 할 필요가 없습니다. 당신이 내가 메인에서 무료로 전화해야한다고 말한다면, 당신은 옳다. 그러나이 프로그램은 메인에 도달하지 못했고, 그래서 그것은 문제가 아니었다! –

+0

@ryyker 나는 그것을 잘 알고있다. 나는 누군가가 내 코드를보고 "char"배열을위한 메모리를 할당했다는 것을 알게된다. –

답변

2

문제는이로 시작

string = malloc (sizeof (char)); 
다음

string 실제 포인터에 대한 포인터입니다. 당신은 역 참조해야합니다

*string = malloc (sizeof (char)); 

그런 문제는

*(string[i]) = getchar(); 

계속 당신은 잘못된 일 역 참조, 당신은을 사용하는 다른 장소와

(*string)[i] = getchar(); 

동일해야합니다 잘못된 역 참조.

그리고 여기에 다음

string[i-1] = '\0'; 

당신이하지 포인터 역 참조 전혀.

(*string)[i-1] = '\0'; 

해야하는 것은 마지막으로, getchar 함수는 int 반환합니다. 결과를 EOF과 비교하여 함수가 실패했는지 여부를 확인할 때 중요합니다. 당신은 전혀 이것을하지 않습니다.

+0

좋아, 나는 그런 분명한 실수를 저 지르지 않았다. getchar 부분에 어떤 의미가 있는지 이해할 수 없지만 키보드에서 스캔하는 경우 EOF를 검색해야하는 이유는 무엇입니까? 나는 '\ n'을 (를) seraching해야하지 않습니까? 나는 EOF가 입력 스트림의 끝에 대해서도 작동한다는 것을 깨닫는다. 그러나이 특별한 경우에 처음으로 개행 문자에 도달하지 않으면 EOF에 도달 할 수 없다. –

+0

@CarlosPinto 기호 상수'EOF'는'int'입니다. 'EOF! = (char) EOF' 가능성이 있습니다. 그리고 newline에 관해서는 파일의 끝 부분 전에 개행 문자가없는 파일에서 입력이 리디렉션되는 경우 어떻게해야합니까? –