如何将 char* 转换为带逗号(小数点)的数字函数?
How to convert a char* to a number function with a comma (decimal point)?
我写 change()
来帮助我将字符串转换为 double
。
例如:如果字符串是“5.5”,我希望数字是5.5。如果字符串是“0.0”,我希望数字是0。另一个例子:“50”到50。
现在的问题是,当我将 change()
与库 math.h 中的 pow()
一起使用时,一切正常,我用大量的输入和所有内容对其进行了测试工作完美。
测试示例:
change("5.0")
给我 5
change("1.5")
给我 1.5
因为我不能使用我写的数学库 power()
,但是当我测试 change()
时,现在我没有得到输出。我认为它陷入了无限循环。
对为什么会发生这种情况有帮助吗?
double change(char* Point) {
int count = 0;
double res = 0;
while (*Point == '0') {
Point++;
}
while (*Point != '.' && *Point) {
count++;
Point++;
}
int num1 = 0;
for (int i = 0; i < count; i++) {
Point--;
num1 = (*Point - '0') * (power(10, i));
}
int i = -1;
while (*Point != '.' && *Point) {
Point++;
}
double num2 = 0;
if (!*Point) {
return res = (double) num1 + num2;
}
Point++;
while (*Point) {
num2 = (double) (*Point - '0') * (double) (power(10, i));
i--;
Point++;
}
res = (double) num1 + num2;
return res;
}
我也写了函数power:
int power(int base,int exp)
{
int result=1;
if(exp == 0){
return 1;
}
while (exp != 0)
{
result=result*base;
exp--;
}
return result;
}
因为你在变化函数中调用了函数power(10,i),而i是负值。您可以通过在幂函数中添加 if 语句来解决此问题
if (exp < 0) {
exp = 0 - exp;
return(1/power(base,exp));
}
编辑:您还必须将幂函数更改为 return double 而不是 int
您可以使用 atof()
将字符串转换为浮点数
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main () {
float val;
char str[20];
strcpy(str, "98993489");
val = atof(str);
printf("String value = %s, Float value = %f\n", str, val);
return(0);
代码源:https://www.tutorialspoint.com/c_standard_library/c_function_atof.htm
正如已经确定的那样,问题是如果 exp
在您的 power
函数中小于 0,则此循环将永远不会结束。
while (exp != 0)
{
result=result*base;
exp--;
}
但是如果你解决这个问题,你的代码仍然无法工作,因为你只在 num1
中存储了一个数字
num1 = (*Point - '0') * (power(10, i));
如果你传入,例如,“50”,它会正常工作,你会得到 50,但如果你传入“54”,你也会得到 50,因为你失去了 4。
您需要像这样将新计算的数字添加到现有值中。
num1 += (*Point - '0') * (power(10, i));
你可以极大地简化函数的第一位并消除使用 power
的需要,尽管通过意识到当你在字符串中移动时,你可以只乘以 num1
的当前值乘以 10,然后加上新数字。这意味着您只处理小数点前的字符串一次而不是 3 次。
int num1 = 0;
for(;isdigit(*Point);Point++) {
num1 *= 10;
num1 += *Point - '0';
}
我还用 isdigit(*Point)
替换了 *Point != '.' && *Point
(来自 "ctype.h"),因为这样可以确保如果它遇到不是数字字符的东西,它不会尝试把它变成一个数字 - 你应该在那个时候完全停止处理。
您可以完全消除对 power
的需求,方法是使用相同的方法来计算 num2
,因为您除以 *Point - '0'
的金额每次也会增加 10。
我写 change()
来帮助我将字符串转换为 double
。
例如:如果字符串是“5.5”,我希望数字是5.5。如果字符串是“0.0”,我希望数字是0。另一个例子:“50”到50。
现在的问题是,当我将 change()
与库 math.h 中的 pow()
一起使用时,一切正常,我用大量的输入和所有内容对其进行了测试工作完美。
测试示例:
change("5.0")
给我 5
change("1.5")
给我 1.5
因为我不能使用我写的数学库 power()
,但是当我测试 change()
时,现在我没有得到输出。我认为它陷入了无限循环。
对为什么会发生这种情况有帮助吗?
double change(char* Point) {
int count = 0;
double res = 0;
while (*Point == '0') {
Point++;
}
while (*Point != '.' && *Point) {
count++;
Point++;
}
int num1 = 0;
for (int i = 0; i < count; i++) {
Point--;
num1 = (*Point - '0') * (power(10, i));
}
int i = -1;
while (*Point != '.' && *Point) {
Point++;
}
double num2 = 0;
if (!*Point) {
return res = (double) num1 + num2;
}
Point++;
while (*Point) {
num2 = (double) (*Point - '0') * (double) (power(10, i));
i--;
Point++;
}
res = (double) num1 + num2;
return res;
}
我也写了函数power:
int power(int base,int exp)
{
int result=1;
if(exp == 0){
return 1;
}
while (exp != 0)
{
result=result*base;
exp--;
}
return result;
}
因为你在变化函数中调用了函数power(10,i),而i是负值。您可以通过在幂函数中添加 if 语句来解决此问题
if (exp < 0) {
exp = 0 - exp;
return(1/power(base,exp));
}
编辑:您还必须将幂函数更改为 return double 而不是 int
您可以使用 atof()
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main () {
float val;
char str[20];
strcpy(str, "98993489");
val = atof(str);
printf("String value = %s, Float value = %f\n", str, val);
return(0);
代码源:https://www.tutorialspoint.com/c_standard_library/c_function_atof.htm
正如已经确定的那样,问题是如果 exp
在您的 power
函数中小于 0,则此循环将永远不会结束。
while (exp != 0)
{
result=result*base;
exp--;
}
但是如果你解决这个问题,你的代码仍然无法工作,因为你只在 num1
num1 = (*Point - '0') * (power(10, i));
如果你传入,例如,“50”,它会正常工作,你会得到 50,但如果你传入“54”,你也会得到 50,因为你失去了 4。
您需要像这样将新计算的数字添加到现有值中。
num1 += (*Point - '0') * (power(10, i));
你可以极大地简化函数的第一位并消除使用 power
的需要,尽管通过意识到当你在字符串中移动时,你可以只乘以 num1
的当前值乘以 10,然后加上新数字。这意味着您只处理小数点前的字符串一次而不是 3 次。
int num1 = 0;
for(;isdigit(*Point);Point++) {
num1 *= 10;
num1 += *Point - '0';
}
我还用 isdigit(*Point)
替换了 *Point != '.' && *Point
(来自 "ctype.h"),因为这样可以确保如果它遇到不是数字字符的东西,它不会尝试把它变成一个数字 - 你应该在那个时候完全停止处理。
您可以完全消除对 power
的需求,方法是使用相同的方法来计算 num2
,因为您除以 *Point - '0'
的金额每次也会增加 10。