试图从 C 中的字符串中删除所有数字
Trying to remove all numbers from a string in C
我正在尝试从字符串 (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。不是数字的字符被放入传入的指针(第二个参数)中。当我将用户重新分配给 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|
char* RemoveDigits(char* input)
{
char* dest = input;
char* src = input;
while(*src)
{
if (isdigit(*src)) { src++; continue; }
*dest++ = *src++;
}
*dest = '[=10=]';
return input;
}
测试:
int main(void)
{
char inText[] = "123 Mickey 456";
printf("The result is %s\n", RemoveDigits(inText));
// Expected Output: " Mickey "
}
号码已删除。
strtoul()
不会从字符串中提取所有数字,它只是试图将字符串转换为数字,并在找到非数字时停止转换。因此,如果您的字符串从数字 strtoul()
开始,则按您预期的方式工作,但如果字符串从字母开始,则 strtoul()
会在第一个符号处停止。要以简单的方式解决您的任务,您应该将所有非数字复制到其他字符串,这将是一个结果。
您遇到的问题是 strtoul 将字符串开头的字符转换为无符号长整型。一旦遇到非数字数字,它就会停止。
第二个参数是指向原始字符缓冲区的指针,指向第一个非数字字符。
http://www.cplusplus.com/reference/cstdlib/strtoul/
参数2:对char*类型对象的引用,其值由函数设置为str中数值后的下一个字符。
因此,如果您尝试 运行“123abc567efg”上的函数,returned 值将为 123。原始字符串缓冲区仍为“123abc567efg”,第二个参数现在指向在该缓冲区中的字符 'a' 处。也就是说,指针 (ptr) 的值将比原始缓冲区指针 (str) 大 3。打印字符串 ptr,会给你 "abc567efg" 因为它只是指向原始缓冲区。
要真正从 C 中的字符串中删除所有数字,您需要执行类似于此答案的操作:Removing spaces and special characters from string
您将允许的函数构建为 return 在 0-9 上为 false,否则为 true。循环并将数字复制到新缓冲区。
我正在尝试从字符串 (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。不是数字的字符被放入传入的指针(第二个参数)中。当我将用户重新分配给 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|
char* RemoveDigits(char* input)
{
char* dest = input;
char* src = input;
while(*src)
{
if (isdigit(*src)) { src++; continue; }
*dest++ = *src++;
}
*dest = '[=10=]';
return input;
}
测试:
int main(void)
{
char inText[] = "123 Mickey 456";
printf("The result is %s\n", RemoveDigits(inText));
// Expected Output: " Mickey "
}
号码已删除。
strtoul()
不会从字符串中提取所有数字,它只是试图将字符串转换为数字,并在找到非数字时停止转换。因此,如果您的字符串从数字 strtoul()
开始,则按您预期的方式工作,但如果字符串从字母开始,则 strtoul()
会在第一个符号处停止。要以简单的方式解决您的任务,您应该将所有非数字复制到其他字符串,这将是一个结果。
您遇到的问题是 strtoul 将字符串开头的字符转换为无符号长整型。一旦遇到非数字数字,它就会停止。
第二个参数是指向原始字符缓冲区的指针,指向第一个非数字字符。
http://www.cplusplus.com/reference/cstdlib/strtoul/
参数2:对char*类型对象的引用,其值由函数设置为str中数值后的下一个字符。
因此,如果您尝试 运行“123abc567efg”上的函数,returned 值将为 123。原始字符串缓冲区仍为“123abc567efg”,第二个参数现在指向在该缓冲区中的字符 'a' 处。也就是说,指针 (ptr) 的值将比原始缓冲区指针 (str) 大 3。打印字符串 ptr,会给你 "abc567efg" 因为它只是指向原始缓冲区。
要真正从 C 中的字符串中删除所有数字,您需要执行类似于此答案的操作:Removing spaces and special characters from string
您将允许的函数构建为 return 在 0-9 上为 false,否则为 true。循环并将数字复制到新缓冲区。