2016-10-01 6 views
2

Как вы разбить строку:Расщепление строки в целые

char *mystring = "12345" 

в целочисленный массив, который выглядит следующим образом:

[1, 2, 3, 4, 5] 

Я пытался что-то вроде кода ниже, но я m не совсем уверен, насколько он надежный, и я думаю, что его легко сломать. Это код:

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

int 
main(void) { 
    char *mystring = "12345"; 
    int string_size, i, length; 

    string_size = strlen(mystring); 

    int values[string_size]; 

    for (i = 0; mystring[i] != '\0'; i++) { 
     values[i] = mystring[i] - 48; 
    } 

    length = sizeof(values)/sizeof(*values); 

    for (i = 0; i < length; i++) { 
     printf("%d ", values[i]); 
    } 

    return 0; 
} 

Какие выходы:

1 2 3 4 5 

Есть более C, как, как я могу это сделать?

+1

Если ваш код «работает», подходящее место для запроса * улучшения * или * мнения *, то это [codereview.stackexchange.com] (http://codereview.stackexchange.com). – WhozCraig

+1

«Есть ли еще C как я могу это сделать?» - Да: не используйте _magic numbers_! Почему '48', а не' '0''? Оба являются целыми числами. – Olaf

+1

'int main (void) {const char * mystring =" 12345 "; const char * ptr = mystring; while (* ptr! = '\ 0') {putchar (* ptr ++); если (* ptr! = '\ 0') putchar (''); } putchar ('\ n'); return 0; } '? Или даже 'int main (void) {puts (" 1 2 3 4 5 "); return 0; } ' –

ответ

2

Странно, что я вижу, что не сама проблема, в том, что вы вычислить длину строки/массив тремя различными способами:

string_size = strlen(mystring); 

for (i = 0; mystring[i] != '\0'; i++) { 

length = sizeof(values)/sizeof(*values); 

где только один метод достаточно:

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

int main(void) { 
    char *mystring = "12345"; 

    size_t length = strlen(mystring); 

    int values[length]; 

    for (int i = 0; i < length; i++) { 
     values[i] = mystring[i] - '0'; 
    } 

    for (int i = 0; i < length; i++) { 
     printf("%d ", values[i]); 
    } 

    printf("\n"); 

    return 0; 
} 
+0

Thankyou. Я все еще привык к C, но это помогает. – RoadRunner

2

Вы можете заменить 48 на '0' для удобства чтения.

Вы можете изменить все петли до цикла string_size, как и первый, не нужно менять метод для каждого цикла.

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

Но в остальном это довольно просто и работает.

+1

Обмен '' 0'' для '48' не только для удобочитаемости. '' 0'' имеет числовое значение '48' только в ASCII и совместимых наборах символов, и там существуют реальные наборы символов, в которых' '0 '' имеет другое числовое значение. Все стандартизованные наборы символов имеют цифры от ''0'' до '' 9'', поэтому вычитание ''0' 'является надежным способом преобразования печатных цифр в числовые значения. – Peter

+0

Спасибо, да, я должен был использовать 'malloc', но я не думал, что это необходимо, поскольку я называл его в основном, и размер массива был исправлен. – RoadRunner

Смежные вопросы