2016-06-11 7 views
2

Вопрос:программа C для преобразования входной строки разделенных пробелами целых чисел в целочисленный массив

Я хочу сделать программу C, которая принимает строку разделенных пробелами целых чисел в качестве входных (положительных и отрицательных, переменное число цифр) и преобразует строку в массив int.

Существует еще один вопрос при чтении int из строкового ввода в массив в Stack Overflow, но он не работает для чисел с длиной цифр более 1 или отрицательных чисел.

Попытка:

#include <stdio.h> 
int main() { 
    int arr[1000], length = 0, c; 
    while ((c = getchar()) != '\n') { 
    if (c != ' ') { 
     arr[length++] = c - '0'; 
    } 
    } 
    printf("["); 
    for (int i = 0; i < length-1; i++) { 
    printf("%d,", arr[i]); 
    } 
    printf("%d]\n", arr[length-1]); 
} 

Если я ввожу следующее в терминале:

$ echo "21 7" | ./run 
$ [2,1,7] 

Это массив, который я получаю: [2,1,7] вместо [21,7 ]

Если я ввожу следующее:

$ echo "-21 7" | ./run 
$ [-3,2,1,7] 

Я получаю: [-3,2,1,7] вместо [-21,7], что не имеет смысла.

Однако, если я вхожу:

$ echo "1 2 3 4 5 6 7" | ./run 
$ [1,2,3,4,5,6,7] 

Примечание: Я предполагаю, что вход это всегда строка разделенных пробелами целых чисел. не

+0

Почему «длина» не инициализируется каким-либо значением перед использованием? – babon

+0

Я исправил это. Я замечаю, что я использую 'getchar', который сканирует 1 символ за раз. Будет ли «сканировать» здесь? Но это не объясняет, почему я получаю '[-3,2,1]' для '-21'. – user6005857

+0

Вы получаете '-3', потому что ASCII для' -' меньше, чем ASCII для '0'. 'getchar()' получает только один символ, независимо от того, какой символ, поэтому вы обрабатываете знак минуса как число. – Arc676

ответ

3

Полная программа (адаптировано из this answer by @onemasse) (больше не требуется недопустимый ввод, чтобы остановить чтение входных данных):

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

int main() { 
    int arr[1000], length = 0, c, bytesread; 
    char input[1000]; 
    fgets(input, sizeof(input), stdin); 
    char* input1 = input; 
    while (sscanf(input1, "%d%n", &c, &bytesread) > 0) { 
     arr[length++] = c; 
     input1 += bytesread; 
    } 
    printf("["); 
    for (int i = 0; i < length-1; i++) { 
     printf("%d,", arr[i]); 
    } 
    printf("%d]\n", arr[length-1]); 
    return 0; 
} 

На странице scanf/sscanf человек:

Эти функции возвращают число введенные элементы. Это может быть меньше, чем предусмотрено, или даже ноль, в случае соответствующего сбоя.

Следовательно, если возвращаемое значение равно 0, вы знаете, что оно больше не может конвертироваться.

Образец I/O:

$ ./parse 
1 2 3 10 11 12 -2 -3 -12 -124 
[1,2,3,10,11,12,-2,-3,-12,-124] 

ПРИМЕЧАНИЕ: Я в настоящее время уверены в том, как именно это работает. Я буду смотреть в него. Однако, если кто-нибудь поймет, отредактируйте это сообщение или оставьте комментарий.

+0

Магия происходит в вызове 'sscanf()', в качестве первого параметра требуется указатель на строку 'char *'. Второй параметр говорит, что вы должны прочитать одно целое число в 'c' и количество байтов, считанных в' bytesread'. Вы используете 'bytesread' для увеличения указателя' input1'. Таким образом вы измените положение, в котором вы читаете следующее целое число. – onemasse

4

Это скелетная версия (без проверки ошибок, замыкающее пространство должно быть оставлены после цифр), я уверен, вы можете забрать отсюда:

int main(void) 
{ 
    int c; 
    int i, num = 0, neg = 0; 
    while ((c = getchar()) != EOF) { 
     if (c != ' ') { 
      if (c == '-') { 
       neg = 1; 
      } else { 
       i = c - '0'; 
       num = num * 10 + i; 
      } 
     } else { 
      (neg == 1) ? num *= -1 : num; 
      printf("%d\n", num + 2); // this is just to show that you indeed get an integer and addition works 
      num = 0; 
      neg = 0; 
     } 
    } 
} 
1

Я не делаю много с, но вот мой ход :)

#include"stdio.h" 
#include"string.h" 
#include"stdlib.h" 

#define CHUNK 1000000 

#define INT_COUNT 10000 


int main(void) { 
/*get all of the input*/ 
char temp_str[CHUNK] = ""; 
char* full_string = malloc(CHUNK * sizeof(char)); 
if (full_string == 0) { 
    printf("Memory Error\n"); 
    exit(1); 
} 
int count = 2; 
do { 
    fgets(temp_str, CHUNK, stdin); 
    strcat(full_string, temp_str); 
    full_string = realloc(full_string, count * CHUNK * sizeof(char)); 
    if (full_string == 0) { 
     printf("Memory Error\n"); 
     exit(1); 
    } 
    count++; 
} while (strlen(temp_str) == CHUNK - 1 && temp_str[CHUNK - 2] != '\n'); 

//parse the input 
char* token = strtok(full_string, " "); 

int* arr = malloc(INT_COUNT * sizeof(int)), length = 0; 
if (arr == 0) { 
    printf("Memory Error\n"); 
    exit(1); 
} 

count = 1; 

while (token != 0) { 
    arr[length] = atoi(token); 
    token = strtok(0, " "); 
    length++; 
    if (length == count * INT_COUNT) { 
     count++; 
     arr = realloc(arr, count * INT_COUNT); 
     if(arr == 0) { 
      printf("Memory Error\n"); 
      exit(1); 
     } 
    } 
} 

free(full_string); 

//print the integers 
for (int i = 0; i < length; i++) { 
    printf("%d ", arr[i]); 
    if (i % 20 == 0 && i != 0) { 
     printf("\n"); 
    } 
} 

free(arr); 

return 0; 
} 
1

Отредактировано немного. Но есть минус проблема. Я оглянусь позже. Если вы немного подберете это, я думаю, это может сработать. Вы пробуйте свой путь. Я попробую. Но позже.

#include <stdio.h> 
int main() { 
    int arr[1000]={0}, length = 0, c, i; 
    while (1) { 
    c = getchar(); 

if(c=='-') 
{ 
    //minus sign has problem yet. I ll come back once I have better soln. 
} 
else if(c==' ' || c=='\n') 
{ 
    length-=2; 
    arr[length]= arr[length]*10 + arr[length+1]; 
    length++; 
    if(c=='\n') 
    { 
     break; 
    } 
} 
else if (c != ' ') { 
    arr[length++] = c - '0'; 
    } 
} 
    printf("["); 
    for (i = 0; i < length-1; i++) { 
printf("%d,", arr[i]); 
    } 
    printf("%d]\n", arr[length-1]); 
} 
Смежные вопросы