нельзя использовать sscanf () в C для массива char - PullRequest
4 голосов
/ 06 апреля 2020

Я пытаюсь получить очень большое число (более unsigned long long int). Поэтому я получаю его в виде строки, а затем преобразую его, di git на di git, в целое число и использую его.

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

int main() 
{ 
    char m[100];
    int x;
    scanf("%s",m);
    for(int i=0; i<strlen(m); i++){
        sscanf(m[i],"%d",&x);
        printf("%d",x);
    }

    return 0; 
}

Однако во время компиляции он показывает:

предупреждение: передача аргумента 1 из 'sscanf' делает указатель из целого числа без приведения

и

примечание: ожидается 'const char * restrict', но аргумент типа 'char'

И когда я запускаю программу, она выдаст мне ошибку Segmentation fault (core dumped).

Я также попробовал более простой код, чтобы найти проблему:

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

int main() 
{ 
    char m[5];
    char n;
    int x;
    scanf("%s",m);
    n = m[1];
    sscanf(n,"%d",&x);  
    return 0; 
}

но ничего не изменилось.

Ответы [ 2 ]

3 голосов
/ 06 апреля 2020

scanf не относится к символам . Когда у вас есть символы, просто преобразуйте цифры в целые числа, вычитая '0' как символ:

for(int i=0; i<strlen(m); i++){
    x = m[i] - '0';   // line to change
    printf("%d",x);
}

Кроме того, просто чтобы убедиться, что буфер не переполнится, 100 байтов это хорошо, но вы можете хотите использовать соответствующий лимит в scanf и проверьте код возврата:

if (scanf("%99s",m) == 1) {
1 голос
/ 06 апреля 2020

Использование sscanf для преобразования single di git строки символов в целое число является неправильным подходом. Для этого вам нужно только вычесть (целочисленное) значение представления символа '0' из этого di git. Как это:

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

int main()
{
    char m[50]; // As pointed out, a 4-digit number isn't really very long, so let's make it bigger
    int x;
    scanf("%49s", m); // Limit the input to the length of the buffer!
    for (size_t i = 0; i < strlen(m); i++) { // The "strlen" function return "size_t"
        x = m[i] - '0'; // The characters `0` thru `9` are GUARANTEED to be sequential!
        printf("%d", x);
    }
    return 0;
}
...