从字符串中提取数字不起作用! C

时间:2014-01-20 08:59:33

标签: c string strtol

我会从ISBN字符串中删除“ - ”。 但我的代码不打印我的价值。故障在哪里?

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++;
    }
}

5 个答案:

答案 0 :(得分: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);

顺便说一句,当p++为真时,您忘了is digit()

答案 1 :(得分: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++;
    }
}

}

在评论中标记了更正!

答案 2 :(得分:0)

假设pchar *指针,您应该将代码更新为

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

按原样保留其余代码。

答案 3 :(得分:0)

错误地使用strtol是不必要的;第二个参数不是输入,而是输出,即它将其设置为最后一个解释字符。最重要的是,为什么你想要将角色转换为长角色然后再将它转换回角色,当你需要的只是一个要打印的角色时?

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

修改

将整个字符串变为长整数:

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

答案 4 :(得分:0)

我认为OP想要的是将带有连字符的字符串转换为长整数。此函数将字符串的十进制数字转换为long。连字符(在任何地方)被忽略,其他字符(包括空格)会导致读取错误:

/*
 *      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。