2017-01-17 3 views
0

사용자가 콘솔에 입력하는 문자열에서 정수를 가져와야합니다.scanf로 문자열 파싱

예 : 나는 다음 문자열을 가지고 있습니다 : [1, 2, 3, 4, 5] 그리고 나는 그것으로부터 모든 정수를 얻고 싶습니다. 이미 scanf("%*[^\[]%d,", &a)과 같은 복수 scanf 패턴을 시도했지만 아무 효과가 없습니다. 스택 오버플로 관련 항목을 찾을 수 없습니다.

주요 문제는 문자열에 1에서 50 개의 정수를 입력 할 수 있다는 것입니다. 배열에 정수 만 저장하는 방법에 대해서는 잘 모른다. (','및 '' ''를 제거하라.)

일부 솔루션은 [] 또는, 같은 특수 문자를 제거하기 위해 발견되었습니다하지만 지금은 여전히 ​​

편집 ... 혼수와 정수 사이의 공간을 제거해야합니다 : 문제는 fgets를 사용하여 해결했다. 내 문자열을 얻기 위해 scanf를 사용했지만 SPACES에 멈추고있었습니다.

좋아한다 밖으로 scanf와 함께 그렇게하는 방법 :

동안 (는 scanf ("% d 개", & 내가))

+1

이 링크를 본 적이 있나요? http://stackoverflow.com/questions/9210528/split-string-with-delimiters-in-c – Marievi

+1

질문이 명확하지 않아 본질적으로 도움이되지 않는 코드 작업을 요청하는 질문을했기 때문에 투표를 마감하기로 결정했습니다. 'scanf()'는 문자열에서 읽는 데 사용되지 않으므로 "패턴"이 작동하지 않습니다. 'sscanf()'[두 번's'에주의하십시오]는 그 목적으로 사용될 수 있습니다. – Peter

+0

조언 : 'scanf' 및 친구들과 구문 분석하지 마세요. 'scanf'는 입력이 미리 결정된 경우에만 사용할 수 있습니다. –

답변

1

당신이 당신의 문자열에서 원하지 않는 문자의 모든 유형을 분리 할 수 ​​strtok를 사용하여이 코드를 사용해보십시오. 이 s 배열에 원하지 않는 문자 세트를 모두 추가하고 strtok이 작업을하도록하십시오.

char str[]="[1,2,3,4,5]"; 
const char s[4] = "[],"; // All unwanted characters to be filtered out 
char *token; 
token = strtok(str, s); 
while(token != NULL) 
{ 
    printf("%d\n", atoi(token)); 
    token = strtok(NULL, s); 
} 

정수 형식이므로 배열에 저장하고 더 멀리 진행할 수 있습니다.

는 출력 :

1 
2 
3 
4 
5 
+0

정말 감사합니다.하지만 약간의 문제가 있습니다. 문자열에 공백을 넣어야합니다 (예 : [1, 2, 3] 그리고 "SPACE"char를 쓸모없는 문자로 설정할 수 없습니다 ... 이것을 우회하는 방법이 있습니까? – Nofix

+0

8 진수 코드 '\ 040'을 const char [5] = "[]에 추가하려고했습니다. \ 040 ' ";하지만 GCC가 내가하고 싶은 것을 이해하지 못하는 것처럼 보입니다. – Nofix

+0

@Nofix 문자열에 공백이 있어도 토큰 라이저가 제대로 작동합니다. 확인해보십시오. 문자열에 공백을 추가하고 코드는 정수 만 출력하여 정상적으로 작동합니다. https://ideone.com/edSfup –

1

scanf/sscanf 정규 표현식을 지원하지 않습니다. 당신은 뭔가를 시도해야합니다 :

const char my_string[] = "[1,2,3,4,5]"; 
int a,b,c,d,e; 
sscanf(my_string, "[%d,%d,%d,%d,%d]", &a, &b, &c, &d, &e); 

예 : http://ideone.com/AOaD7x

또한 scanf/sscanf의 반환 값을 확인하는 것이 좋을 수 있습니다

int retval = sscanf(my_string, "[%d,%d,%d,%d,%d]", &a, &b, &c, &d, &e); 
if (retval != 5) 
    fprintf(stderr, "could not parse all integers\n"); 

Reference

편집 : 귀하의 이메일 질문에 대답하면 정수의 개수가 가변적 인 경우이를 수행하는 방법을 묻습니다. strchr을 사용하여 문자열에서 다음 쉼표를 찾아서 더 이상 쉼표가 없을 때까지 계속 반복 할 수 있습니다. 문자열이 ]으로 끝나는 것으로 가정합니다.

const char my_string[] = "[1,2,3,4,5]"; 

/* start at first integer */ 
const char *curr = &my_string[1]; 

while (curr != NULL) { 
    /* scan and print the integer at curr */ 
    int tmp; 
    sscanf(curr, "%d", &tmp); 
    printf("%d\n", tmp); 

    /* find next comma */ 
    curr = strchr(curr, ','); 

    /* if a comma was found, go to next integer */ 
    if (curr) 
     /* warning: this assumes that the string ends with ']' */ 
     curr += 1; 
} 

예 : http://ideone.com/RZkjWN

+0

Okey 고맙지 만 내 주요 문제는 문자열에 얼마나 많은 숫자가 들어갈 수 있는지 전혀 알 수 없다는 것입니다. 내 말은 : 50 개가 넘는 숫자는 없지만 문자열의 정수의 수는 const가 아닙니다. – Nofix

+0

0을 반환 할 때까지 반복하여 sscanf (오프셋 사용)를 호출하십시오. – gurka

+0

나는 그것을 얻지 못한다 : const 문자열로 sscanf를 사용하여 반복을 어떻게 할 수 있는가? 내 말은 : 문자열이 각 간섭마다 바뀌지 않으므로 끝이 없을 것입니다. scanf ("% c % d", & test, & tab [0]); 그리고 scanf는 끝나지 않습니다 ... – Nofix

0

문자열을 구문 분석 scanf()를 사용하지 않는 것이 좋습니다.

다른 대답과 마찬가지로 strtok을 사용하여 "[]," 사이의 숫자를 구문 분석하고 strtol을 사용하여 찾은 숫자를 변환 할 수 있습니다.정수 변환에 대해 atoi()과 같은 것을 사용하는 것은 위험합니다. 오류 확인이 없기 때문입니다. strtol()으로 더 많은 오류 검사가 man page에 있습니다. 여기

들은 (향상시킬 수있다) 수행하는 코드 일부 샘플 이렇

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

#define MAXNUM 50 
#define BASE 10 

int main(void) { 
    char string[] = "[1,2,3,4,5]"; 
    char *number, *endptr; 
    const char *delim = "[],"; 
    int numbers[MAXNUM], current; 
    size_t i, count = 0; 

    number = strtok(string, delim); 
    while (number != NULL) { 
     current = strtol(number, &endptr, BASE); 

     /* checking if valid digit found */ 
     /* more error checking can be added */ 
     if (endptr != number) { 
      numbers[count++] = current; 
     } 
     number = strtok(NULL, delim); 
    } 

    for (i = 0; i < count; i++) { 
     printf("numbers[%zu] = %d\n", i, numbers[i]); 
    } 

    return 0; 
} 

샘플 입력 1

string[] = "[1,2,3,4,5]"; 

출력 1 :

numbers[0] = 1 
numbers[1] = 2 
numbers[2] = 3 
numbers[3] = 4 
numbers[4] = 5 

시료 입구 2 :

string[] = "[1,a,3,c,5]"; 
,

출력 2 :

numbers[0] = 1 
numbers[1] = 3 
numbers[2] = 5