Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
尝试删除C中字符串中的所有数字_C_String_Char - Fatal编程技术网

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

尝试删除C中字符串中的所有数字,c,string,char,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应该将字符串转换为无符号长字符串。不是数字的字符被放入传入的指针(第二个参数)。当我将用户重新分配到new

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

以下是我现在拥有的:

    // Take numbers out of username if they exist - don't care about these
    char * newStr;
    strtoul(user, &newStr, 10);
    user = newStr;
我的理解是strtoul应该将字符串转换为无符号长字符串。不是数字的字符被放入传入的指针(第二个参数)。当我将用户重新分配到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);
}
测试:

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

数字已被删除。

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

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

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

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

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

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


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

这根本不是所说的。@abelenky查看我的编辑“我的理解是strtoul应该将字符串转换为无符号长字符串。不是数字的字符被放入传入指针(第二个参数)。”你的理解仍然是错误的。@BeyelerStudios:永远不要使用
strtok
。它坏得无可救药。如果必须,您可以使用
strtok\r
。但是,每当你看到任何版本的strtok时,你都应该开始质疑你的人生选择。@abelenky奇怪的是,每次我使用COk时,我都会遇到这种情况,我现在明白了。你知道我可以使用什么工作方法来实现这一点吗?我在回答中提供了一个链接,指向一个解决方案(将你需要的内容复制到一个新的缓冲区)。故事的寓意:很多时候没有一个
stdlib
方法可以调用。您必须实际编写代码。(这是程序员的工作)
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 "
}