我会从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++;
}
}
答案 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)
假设p
是char *
指针,您应该将代码更新为
//-----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。