2016-09-29 2 views
-1

나는이 이상한 문제를 안고 있습니다.C의 선도적 인 공간 유지

int B; 
char *a = (char*)malloc(1000*sizeof(char); 

scanf("%[^\n]s", a); 
printf("%c\n", a[0]); 
B = strlen(a); 
printf("%d\n", B); 

I 같은 항목 넣으면 :

" abc " 

A [0] = 'A'및 B = 5 (이하 "ABC"를 더한 마지막 두 공간). 처음 세 칸을 계산하고 싶습니다. 어떻게합니까?

+0

코드의 당신의'scanf' 라인은 무엇을 설명한다. –

+0

'int spaces; scanf ("% n % [^ \ n]", & spaces, a); ' – BLUEPIXY

+0

'% []'를 사용하여 일련의 공백을 읽습니다. – Barmar

답변

2

scanf()을 사용하는 대신 fgets()을 사용하여 전체 줄을 읽을 수 있습니다.이 줄은 명시 적으로 캡처하지 않는 한 일반적으로 공백을 건너 뜁니다. 당신은 최고의 공간을 다듬을 경우

int B; 
char *a = malloc(1000 * sizeof*a); /* don't cast malloc */ 

if (fgets(a, 1000, stdin) == NULL) { 
    fputs("Could not read input\n", stdout); 
} 
else { 
    printf("%c\n", a[0]); 
    B = strlen(a); 
    printf("%d\n", B); 
} 
+0

을 보내 주셔서 감사합니다. 이것은 몇 가지 문제를 해결합니다. 나는 fgets가 strlen 카운트에서 공백을 무시한다고 생각했다. – Tricolor

+0

@Tricolor'strlen()'은'\ 0' 종료까지 이어지는 모든 문자를 센다. 그 사이의 문자는 건너 뛰지 않습니다. 'fgets()'는'scanf()'와는 다른데, 왜냐하면'fetch()'가 입력 스트림에서 전체 라인을 읽도록 설계된 반면'scanf()'는 특정 입력을 해석하도록 설계되어 있기 때문입니다. 'scanf()'는 선택된 경우에만 문자열 입력에 사용해야합니다. 그렇지 않으면'fgets()'가 아마도 필요한 것일 것이다. –

0

, 당신이 시도 할 수 있습니다 :

void trim_left(char *p); 
int main() 
{ 
    int B; 
    char *a = (char*)malloc(1000*sizeof(char)); 

    scanf("%[^\n]s", a); 
    printf("%c\n", a[0]); 
    trim_left(a); 
    B = strlen(a); 
    printf("%d\n", B); 
    printf("a = %s\n", a); 
    return 0; 
} 

void trim_left(char *p) { 
    int i = 0; 
    while (p[i] && isspace(p[i])) { 
    i++; 
    } 
    memmove(p, p+i, strlen(p+i)); 
    p[strlen(p+i)] = '\0'; 
} 
관련 문제