Как мне преобразовать строку в целое число в этом случае? - PullRequest
1 голос
/ 07 апреля 2020

У меня есть эта проблема как часть моего проекта программирования c. Я читаю пользовательский ввод в массив типов символов (char*str), и мне нужно преобразовать некоторые части строкового ввода в целое число. Ввод может быть "Смегол 21 огонь 22"

Вот некоторые испытания. Я пытаюсь получить х = 40. Этот код дает х = -4324242. Почему этот код не работает?

#include <stdio.h>

int main(){
    char *uga[1];
    uga[0] = "10";
    printf("%s\n", uga[0]);
    int x = 50 - (int)uga[0];
    printf("%d",x);     
}

Заранее спасибо.

Ответы [ 5 ]

1 голос
/ 07 апреля 2020

Вы можете использовать strtol, sscanf или atoi для преобразования строки в int. Например:

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

int main() {
    char *str[3] = {"10", "20 test of strtol\n", "30"};
    int a = atoi(str[0]);
    printf("a = %d\n", a);
    char *ptr;
    long int b = strtol(str[1], &ptr, 10); // you can alse use strtoll for long long int
    printf("b = %ld, string: %s", b, ptr);
    int c;
    sscanf(str[2], "%d", &c);
    printf("c = %d\n", c);
    return 0;
}

Вывод:

a = 10
b = 20, string:  test of strtol
c = 30

В вашем коде uga[0] - это указатель, который указывает на символ. Так что (int) uga[0] просто приведите адрес указателя char.

0 голосов
/ 07 апреля 2020

Вы должны использовать функцию atoi() в stdlib.h. Например,

    int val; 
    char strn1[] = "12546"; 

    val = atoi(strn1); 
    printf("String value = %s\n", strn1); 
    printf("Integer value = %d\n", val); 

    char strn2[] = "12Ge 1 89"; 
    val = atoi(strn2); 
    printf("String value = %s\n", strn2); 
    printf("Integer value = %d\n", val); 

Вывод:

Строковое значение = 12546 Целочисленное значение = 12546 Строковое значение = 12Ge 1 89 Целочисленное значение = 12

Надеюсь, это поможет! дает

0 голосов
/ 07 апреля 2020

В вашем коде две проблемы.

  1. uga - это не строка, как вы думаете, а массив строк, содержащий только одну строку, для которой не выделена память. Чтобы это исправить, вы должны объявить uga следующим образом: char uga[max_size_of_your_string] = "Initialization if you want to";
  2. Таким образом, (int)uga[0]; не будет работать так, как вы ожидаете, потому что вы пытаетесь преобразовать адрес в целое число.

Я советую вам правильно объявить вашу строку uga и взглянуть на различные способы преобразования числовой строки в целое здесь: Как преобразовать строку в целое в C?

0 голосов
/ 07 апреля 2020

Вы можете использовать sscanf также как это, например

#include <stdio.h>

int main(){
    char str[] = "A smeagol 21 fire 22";
    int a, b;

    if (2 != sscanf(str, "%*[^0-9] %d %*[^0-9] %d", &a, &b))
      return printf("Error\n"), 1;

    printf("%d %d",a, b);     
}

Выход

21 22

%*[^0-9] будет соответствовать любому не ди git символу, и он будет отброшен (из-за *). sscanf возвращает количество переменных, которые он смог заполнить. Здесь должно быть 2, иначе что-то пошло не так.

0 голосов
/ 07 апреля 2020

Тип приведение указателя или массива char к int или другому типу цифр c не даст вам значение чисел c текста в строке.

Вы должны использовать функции strtol (со знаком), strtoul (без знака) для выполнения sh this:

char *str = "123ABC";
char *pStop;     

// (Arguments: string to parse, pointer to character that stops the parse, base/radix)
int value = strtol(str, &pStop, 10); 

После этого value будет 123, а pStop будет указывать на «А» в str. Второй аргумент может быть NULL, если вам это безразлично, но он полезен для обработки строки с большим количеством цифр между нечисловым c текстом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...