2016-02-29 6 views
1

У меня есть строка, например «101 1 13», и мне нужно разбить ее на int aux [3] ->, в результате чего aux [0] = 101, aux [1] = 1 и aux [2] = 13 (в данном случае). Как можно Я делаю это?Как разбить строку на int [3]

В примере приведенного ниже кода я получаю op как строку и хочу получить значение INTs там. Каждый int делится на строку пробелом ("").

Другая деталь: Мне нужен код для компиляции с флагом -std = c99, поэтому принятый ответ не сработает.

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


//example of str = "101 1 14" (char *) 
// example of output = {101, 1, 14}(int *) 
int* stoi(char *str) { 
    // function to split str into 3 ints 

} 
    int main() { 
     char op[10]; 
     int num[3]; 

     scanf("%s\n", op); 

     num = stoi(op); 
     printf("%d %d %d", num[0], num[1], num[2]); 

     return 0; 
    } 
+0

Вы уверены, что 'scanf()' не повесил трубку с возвратом каретки? – ryyker

+0

'strncpy' - ваш друг.(например, 'strncpy (tmp, str, 3)", а затем либо 'aux [0] = atoi (tmp);' или 'aux [0] = (int) strtol (tmp, NULL, 10);' Или, 'scanf'. Также см.: [** Я делаю результат malloc? **] (http://stackoverflow.com/q/605845/995714) –

+0

' scanf ("% s \ n", op); while (op! = EOF) ... '' EOF' - это возможное возвращаемое значение 'scanf', а не возможное значение для преобразования. Это должно читать' while (scanf ("% s \ n", op) = = 1) ... '. Кроме того,' op' имеет длину 6 символов, которая может содержать до пяти символов. Ваша строка примера не подходит. Более того, вы, вероятно, столкнетесь с переполнением буфера. –

ответ

0

Смотрите этот пример того, как сделать это:

char string [10] = "101 1 666" 
int v [3], n=0, j=0; 
int tam = strlen(string); 
int current_Len = 0; 

for(i=0; i<tam; i++){ 
    //32 = ascii for White space 
    if(string[i] != 32){ 
      n = n*10 + string[i] - '0'; 
      current_len++; 
    } else if (current_len > 0){ 
      v[j++] = n; 
      current_len = 0; 
      n=0; 
    } 
} 
if (current_len > 0){ 
      v[j++] = n; 
} 
+0

Что делать, если вход имеет последовательные пробелы? Если на входе есть цифры без цифр? Если 'j' превышает 2? –

+0

Почему '32' вместо' if (string [i]! = '') {'? – chux

+0

Я обновил свой ответ! Проверьте это! –

1

Попробуйте заменить код на следующий код.

Новый код работает только в том случае, если ввод содержит только одно пространство между целыми числами.

Ваш код:

while(op[cont] != '\0') { 
       for(i = 0; op[cont] != ' '; i++, cont++) { 

        num[i] += op[cont]; 
       } 
       printf("num[i] = %d\n", num[i]); 
      } 

Новый код:

while(op[cont] != '\0') 
      { 
       if(op[cont] != ' ') 
        num[i] = num[i]*10 + (op[cont]- '0'); 
       else 
        i++; 
       cont++; 
      } 
2

Прежде всего, необходимо разметить свой вход (распадаться вход на отдельные элементы). Затем вам нужно разобрать/целое число отдельных токенов, переведя их из строк в нужный формат.


Пример кода


#include <stdio.h> 
#include <string.h> 
#define BUF_LEN  (64) 

int main(void) 
{ 
    char buf[BUF_LEN] = { 0 }; 
    char* rest = buf; 
    char* token; 
    int i = 0; 
    int iArr[100] = { 0 }; 

    if (fgets(buf, BUF_LEN, stdin) != NULL) 
    { 
     strtok(buf, "\n"); // Remove newline from input buffer in case we want to call fgets() again. 
     while ((token = strtok_r(rest, " ", &rest)) != NULL) 
     { 
      iArr[i] = strtol(token, NULL, 10); 
      printf("Token %d:[%d].\n", i, iArr[i]); 
      i++; 
     } 
    } 

    return 0; 
} 

Sample Run


1231 12312 312 1232 1312 
Token 0:[1231]. 
Token 1:[12312]. 
Token 2:[312]. 
Token 3:[1232]. 
Token 4:[1312]. 

+0

Есть ли 'strtok (buf," \ n ");' удалить '' \ n'', если это начальный символ 'char'? – chux

+0

@chux Nope, он остается во входном буфере, поэтому буфер эффективно '0x0A 0x00 0x00 0x00 ... 0x00'. Это приводит к тому, что приведенный выше пример обнаруживает один вход: 0, что в общем случае является неправильным. Если это вызывает беспокойство, OP должен сделать проверку на 'if (buf [0] == '\ n') return -1;' или что-то подобное. – DevNull

+0

Возможно, http://stackoverflow.com/q/2693776/2410359? – chux

0

Этот ответ предполагает, что вы знаете, сколько целых чисел содержится в вашей строке во время написания вашего кода. Он также использует специальное расширение clang/gcc (typeof) и может не быть портативным. Но это может быть полезно кому-то (я в основном писал это, потому что мне нечего было делать).

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

struct {int _[3];} strToInt3(const char (*pStr)[]) 
{ 
    int result[3] = {0}, *pr = result; 

    for(register const char *p = *pStr; *p; ++p) 
    { 
     if(*p == ' ') ++pr; 
     else 
      *pr *= 10, 
      *pr += *p - '0';  
    } 

    return *(__typeof__(strToInt3(0)) *)result; 
} 

int main() 
{ 

    char op[10]; 
    int num[3]; 

    scanf("%10[^\n]", op), 

    //memcpy(num, strToInt3(op)._, sizeof(num)); 
    //or 
    *(__typeof__(strToInt3(0)) *)num = strToInt3(op); 

    printf("%d %d %d", num[0], num[1], num[2]); 
} 

Я прокомментировал копирование возвращенного массива с использованием memcpy и добавил назначение структуры. Хотя оба они должны быть действительными (не стандартные, я думаю, но работающие в большинстве случаев), я предпочитаю второй вариант (и, возможно, некоторые оптимизаторы компилятора будут).

Также я предполагаю, что набор символов ASCII для символов.

0

Я нашел более легкий подход к проблеме. Я вставляю scanf, который не захватывает пространственное одеяло и не конвертирует его с помощью atoi. Поскольку это всего лишь 3 интервала, не так уж плохо использовать этот простой, повторяющийся способ ловли значений. И он работает с флагом -std = c99, который мне нужно использовать.

scanf("%s[^ ]\n", op); 
    num[0] = atoi(op); 

    scanf("%s[^ ]\n", op); 
    num[1] = atoi(op); 

    scanf("%s[^ ]\n", op); 
    num[2] = atoi(op); 

    printf("%d\n", num[0]); 
    printf("%d\n", num[1]); 
    printf("%d\n", num[2]); 
Смежные вопросы