2014-01-20 5 views
0

Я бы удалил «-» из строки ISBN. Но мой код не выдаст мне значение. Где ошибка?Извлечение чисел из строки не работает! c

char *ISBN[20]; //example: 3-423-62167-2 
*p = ISBN; 

strcpy(ISBN, ptr); //Copy from a Buffer 
printf("\nISBN Array: %s", ISBN); //This works! 

while(*p) 
{ 
    if (isdigit(*p)) 
    { 
     long val = strtol(p, &p, 10); 
     printf("%ld\n", val);   //Do not show anything! 
    } 
    else 
    { 
     p++; 
    } 
} 
+2

Что такое декларация 'p'? – Dipto

+3

'char * ISBN [20]'? Конечно? Массив массива? –

+0

что это должно быть? – Tommy

ответ

0

Неверно использовать strtol не нужно; второй аргумент не является входом, а выходом, то есть он устанавливает его на последний интерпретируемый символ. Прежде всего, почему вы хотите преобразовать символ в длинный, а затем преобразовать его обратно в символ, когда все, что вам нужно, это символ для печати?

char ISBN[] = "3-423-62167-2"; 
char *p = ISBN; 
while (*p) 
{ 
    if (isdigit(*p)) 
     printf("%c", *p); 
    ++p; 
} 

EDIT:

Чтобы сделать всю строку в длинный:

unsigned long long num = 0; 
while (*p) 
{ 
    if (isdigit(*p)) 
    { 
     const char digit = *p - '0'; 
     num = (num * 10) + digit; 
    } 
    ++p; 
} 
+0

Мне нужно преобразовать строку ISBN в long без «-», чтобы работать с этим в операции Modulo. Но с вашим примером я только печатаю строку. Как я могу это сделать? – Tommy

+0

Вы имеете в виду каждую цифру как 'long' или целое _3423621672_ как' long'? – legends2k

+0

весь длинный: 3423621672 – Tommy

2

насчет:

for (char* p = ISBN; *p != '\0'; p++) 
{ 
    if (isdigit(*p)) 
    { 
     printf("%c", *p); 
    } 
} 

Если вы хотите long: Сохранить символы в char[] (вместо printf()), а затем, когда все сделано, что преобразования в long. Можно даже использовать ISBN массив сделать обращенный на месте:

int i = 0; 
for (char* p = ISBN; *p != '\0'; p++) 
{ 
    if (isdigit(*p)) 
    { 
     ISBN[i++] = *p; 
    } 
} 

ISBN[i] = '\0'; 

long isbn = strtol(ISBN, NULL, 10); 

BTW, вы забыли p++ когда is digit() верно.

0

Предполагая p является char * указателем вы должны обновить свой код

//-----v no * 
    char ISBN[20]; //example: 3-423-62167-2 
    p = ISBN; 
//^-- no * 

сохранить остальную часть кода, как есть.

+2

Кроме того, 'strtol()' не делает то, что думает OP. –

1

Следующий код работает для меня:

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

int main() 
{ 

char *ptr = "3-423-62167-2"; 
char ISBN[20]; // should be either ISBN[] or char *ISBN for a string 
char *p = ISBN; // declared this one here.. else should be p = ISBN 

strcpy(ISBN, ptr); 
printf("\nISBN Array: %s\n", ISBN); 

while(*p) 
{ 
    if (isdigit(*p)) 
    { 
     long val = strtol(p, &p, 10); 
     printf("%ld\n", val); 
    } 
    else 
    { 
     p++; 
    } 
} 

} 

ознаменовали корректировки в комментариях!

+0

Спасибо всем! Ответы полезны! Но как я могу долго сохранять новую ценность и работать с ней? – Tommy

+0

@ legendends2k: зачем это было? «3-423-62167-2» - строка с нулевым завершением, поэтому (* p) является достаточно хорошим условием выхода. – th33lf

+0

Этот код будет извлекать номера отдельно; если вы только хотите избавиться от дефисов и преобразовать объединенное число в длинный, тогда ответ от @ смысл-вопросов - тот, который вы хотите. – th33lf

0

Я думаю, что ОП хочет, чтобы преобразовать строку с переносами в длинное целое. Эта функция преобразует десятичные цифры строки в длинную. Дефис (в любом месте) игнорируется, другие символы, в том числе места, привести к читающей ошибке:

/* 
*  Return ISBN as long or -1L on format error 
*/ 
long isbn(const char *str) 
{ 
    long n = 0L; 

    if (*str == '\0') return -1L; 

    while (*str) { 
     if (isdigit(*str)) { 
      n = n * 10 + *str - '0'; 
     } else { 
      if (*str != '-') return -1L; 
     } 
     str++; 
    } 

    return n; 
} 

Обратите внимание, что long имеет такой же размер, как int на некоторых машинах и не может быть достаточно широкими, чтобы сохранить числовой ISBN.

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