我正在尝试从字符串中取出所有数字(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|
答案 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。循环并将数字复制到新缓冲区。