2017-12-10 33 views
-1

나는이 하나와 같은 stdin에서 문자열을 구문 분석하려고합니다 { 7 , 3,5 ,11, 8, 16, 4, 9, 2 ,8, 4, 2} (2 ~ 8 사이에 \ n이 있습니다).개행과 공백으로 문자열 읽기

나는 숫자를 추출하고 쉼표 공백과 개행 문자를 줄여서 (숯을 입력으로 받아들임) 함수를 만들었지 만, 문제는 scanf를 사용하여 입력을 얻으 려 할 때 공백을 얻을 수 없어 대신 fgets를 사용했습니다. 그러나 fgets는 \ n을 보자 마자 종료됩니다.

여기에서 문자열을 얻을 수있는 방법이 있습니까?

+0

'숯 partA [199]을 partB [99]; fgets (partA, 99, stream); fgets (partB, 99, stream); partA [strlen (partA) -1] = 0; strcat (partA, partB);'<== 그것은'partA'에 있습니다! –

답변

0

fgets을 사용하면 전체 줄을 읽고 strtok을 사용하여 숫자를 읽을 수 있습니다. 예는 다음과 같은 쉼표로 \n를 취급 ,

char line[512]; 
char *buf = 0; 
while(fgets(line, sizeof(line), stdin)) 
{ 
    if(!strstr(line, "{") && !buf) 
     continue; 

    if(!buf) 
    { 
     buf = strdup(line); 
    } 
    else 
    { 
     buf = realloc(buf, strlen(buf) + strlen(line) + 1); 
     strcat(buf, line); 
    } 

    if(strstr(line, "}")) 
    { 
     char *token = strtok(buf, "{"); 
     strtok(buf, ",}\n"); 
     while(token) 
     { 
      int n = 0; 
      sscanf(token, "%d", &n); 
      printf("%d, ", n); 
      token = strtok(NULL, ",}\n"); 
     } 
     free(buf); 
     break; 
    } 
} 
1
int nums[1000], count = 0; 
char chr; 
while(scanf("%c%d", &chr, &nums[count]) > 0) //there was at least one match 
{ 
    if(chr == '}') 
     break; //we have reached the end 
    if(chr != ',' && chr != '{') 
     continue; //skip spaces (} is an exception) 
    count++; 
}