试图从C中的字符串中删除所有数字

时间:2015-02-05 20:13:48

标签: c string char

我正在尝试从字符串中取出所有数字(char *)......

这就是我现在所拥有的:

    // Take numbers out of username if they exist - don't care about these
    char * newStr;
    strtoul(user, &newStr, 10);
    user = newStr;

我的理解是strtoul应该将字符串转换为unsigned long。不是数字的字符被放入传入的指针(第二个arg)。当我将用户重新分配给newStr并打印它时,字符串保持不变。为什么是这样?有谁知道更好的方法?

来自文档示例:

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

int main()
{
char str[30] = "2030300 This is test";
char *ptr;
long ret;

ret = strtoul(str, &ptr, 10);
printf("The number(unsigned long integer) is %lu\n", ret);
printf("String part is |%s|", ptr);

return(0);
}

让我们编译并运行上面的程序,这将产生以下结果:

The number(unsigned long integer) is 2030300
String part is | This is test|

3 个答案:

答案 0 :(得分:3)

char* RemoveDigits(char* input)
{
    char* dest = input;
    char* src = input;

    while(*src)
    {
        if (isdigit(*src)) { src++; continue; }
        *dest++ = *src++;
    }
    *dest = '\0';
    return input;
}

<强>测试

int main(void)
{
    char inText[] = "123 Mickey 456";
    printf("The result is %s\n", RemoveDigits(inText));
    // Expected Output: " Mickey "
}

数字已删除。

答案 1 :(得分:0)

strtoul()不从字符串中提取所有数字,它只是尝试将字符串转换为数字,并且当找到非数字时转换停止。因此,如果您的字符串从数字strtoul()开始按预期工作,但如果字符串从字母开始,则strtoul()将停在第一个符号处。要以简单的方式解决您的任务,您应该将所有非数字复制到其他字符串,这将是结果。

答案 2 :(得分:0)

你遇到的问题是strtoul正在将字符串开头的字符转换为unsigned long。一旦遇到非数字数字,它就会停止。

第二个参数是指向原始字符缓冲区的指针,指向第一个非数字字符。

http://www.cplusplus.com/reference/cstdlib/strtoul/

参数2 引用char *类型的对象,其值由函数设置为数值后的str中的下一个字符。

因此,如果您尝试在“123abc567efg”上运行该函数,则返回的值将为123.原始字符串缓冲区仍为“123abc567efg”,第二个参数现在指向该缓冲区中的字符“a”。也就是说,指针(ptr)将具有比原始缓冲区指针(str)大3的值。打印字符串ptr会给你“abc567efg”,因为它只是指向原始缓冲区。

要实际删除C中字符串中的所有数字,您需要执行与此答案类似的操作:Removing spaces and special characters from string

您构建允许的函数以在0-9上返回false,否则返回true。循环并将数字复制到新缓冲区。