我试图转换包含数字的字符串。数字是千分之一点。我用sscanf(input, "%i.%i", &first, %second); return first * 1000 + second;
这没关系,但它有其局限性,因为它只适用于低于1.000.000的数字。我试过这个递归,但我的程序不会编译。也许你们其中一个人,可以看到错误。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char* concat(const char *s1, const char *s2) {
char *result = malloc(strlen(s1)+strlen(s2)+1);//+1 for the zero-terminator
strcpy(result, s1);
strcat(result, s2);
return result;
}
char *convert_spectators( char *input) //
{
char fir[3], sec[100];
int scan_res = sscanf(input, "%3[0123456789]%*[^0123456789]%s", fir, sec);
if (scan_res == 2) {
return concat(fir, convert_spectators(sec));
} else if (scan_res == 1) {
return fir;
}
}
int main() {
printf("Result: %i\n", atoi(convert_spectators("123.456.789")));
return 1;
}
答案 0 :(得分:1)
您将返回“fir”,这是一个本地数组。这是错误的。我修改了你的代码并从调用函数传递了fir和sec。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char* concat(const char *s1, const char *s2) {
char *result = malloc(strlen(s1)+strlen(s2)+1);//+1 for the zero-terminator
strcpy(result, s1);
strcat(result, s2);
return result;
}
char *convert_spectators( char *input, char *fir, char *sec) //
{
int scan_res = sscanf(input, "%3[0123456789]%*[^0123456789]%s", fir, sec);
if (scan_res == 2) {
char firTemp[4] = "";
char secTemp[100] = "";
return concat(fir, convert_spectators(sec, firTemp, secTemp));
} else if (scan_res == 1) {
return fir;
} else {
printf("Something wrong, scan_res[%d]\n", scan_res);
return NULL;
}
}
int main() {
char fir[4] = "";
char sec[100] = "";
printf("Result: %i\n", atoi(convert_spectators("123.456.789", fir, sec)));
return 1;
}
答案 1 :(得分:0)
这可以在没有scanf
int convert(char *s, int n) {
if (!*s || n >= 1000000000)
return n;
if (*s >= '0' && *s <= '9')
n = n * 10 + *s - 48;
return convert(s+1, n);
}
int main() {
char *str = "123.456.789";
printf("%d\n", convert(str, 0));
}
这将只解析字符串,并跳过任何非数字字符。并在字符串的末尾或结果溢出32位时停止。
如上所述,您连接每个子字符串并转换为整数的方式很好,但您在函数convert_spectators()
中返回一个本地数组。您需要在调用函数之前在本地声明该数组,或将其设置为全局。