2011-12-09 3 views
0

나는 기본적으로 문자열로 처리 될 char *를 만들고 있습니다. 문자열은 반복해서 사용되는 것으로 가정합니다. 매번 while 루프를 점검하고 "종료"가 올바른지 확인하려고 시도 할 때마다 ...scanf를 사용하여 while 루프에 대해 생성하고 유효성을 검사 할 문자열을 얻습니다. 계속 ...

* 계속 세분화 오류가 발생합니다. 내가 뭘 잘못하고 있습니까? 꽤 바보 같은 실수를했을 가능성이 있습니다. ? 내가 처음보기에서 볼

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

int main(int argc, char* argv[]) 
{ 

    char* input = (char*)malloc(sizeof(char)); 
    input = "CONTINUE"; 

    while(strcmp(input, "quit") != 0) 
    { 
      printf("%s", "System: "); 
      scanf("%s", input); 
    } 
    return 0; 
} 

답변

1

두 가지 문제 :

char* input = (char*)malloc(sizeof(char)); 
  1. 당신은 단지 하나 개의 문자의 메모리 포인터를 할당한다. 한 문자가 아닌 문자열을 저장할 수있는 충분한 메모리가 있어야합니다.

  2. strcpy을 사용하여 할당 된 버퍼로 문자열을 복사해야합니다. 포인터에 문자열 리터럴을 할당하지 않습니다. 이러한 문자열 리터럴을 수정하면 의 정의되지 않은 동작이 발생합니다.

    input = "CONTINUE";

    위의 2 일을

올바른 방법은 다음과 같습니다 MAX_LENGTH 충분

char* input = (char*)malloc(sizeof(MAX_LENGTH)); 
strcpy(input, "YOURSTRING"); 

이 입력 문자열을 개최.

1

불법적 인 문자를 변경하려고합니다. 시도 :

char* input = (char*)malloc(sizeof(char)); /* You need more than one char. */ 
char* input = (char*)malloc(LENGTH); /* Allocate `LENGTH` chars. */ 

input = "CONTINUE"; /* You can't write (scanf) over a string literal. */ 
strcpy(input, "CONTINUE"); /* Now it's legal to write over `input`. */ 

다른 점은 조심하기 :

  • 베어 "% s는"안전하지 않은으로 scanf 사용. 당신은 잠재적으로 악의적 인 사용자가 10 개 이상의 문자

  • 당신이 1을 보장 것 이후 sizeof(char)이 필요하지 않습니다 알고 계십니까를 입력하지 않도록하기 위해 "%10s" 같은 것을 사용 하는가?

+0

그래서했다면 ... 문자 입력 * = (숯 *)의 malloc (LENGTH); // 길이는 80 또는 100과 같습니다 ... 그렇다면 계속해서 문자열을 다시 쓰는 while 루프를 할 수 있을까요? –

+0

내가 보여줬 듯이 "CONTINUE"를 지정하거나 "strcpy"를 사용하지 마십시오. – cnicutar

+0

아주 좋은 - 고마워요. 많은 사람. 내가 말했듯이, 매우 바보 같은 오류. –