我需要从字符串中扫描一个双字母,你能帮帮我吗?它必须是这样的:
#include <stdio.h>
#include <string.h>
int main()
{
const char *key="infinity";
const char *str = malloc(2*sizeof(double*));
double a;
printf("Write the value: "
scanf("%s",str);
if (strcmp(str,key)==0)
printf ("ok");
else
{
sscanf(str,"%lf",&a);
printf("ok, a is %lf",a);
}
return 0;
当我放入无限时,它可以正常工作。但是当我输入一些double
值(如1.25)时,它不会。
1.25
ok, a is 0.000000
答案 0 :(得分:1)
首先,有一种方法可以检查代码行是否成功运行。
您正在使用sscanf()
,检查它的返回值,以确定它是否成功完成了它应该做的事情。 (从str
获得双倍。
同样为什么const char*
。它指向immutable
字符串。你无法改变它的价值。所以第一个scanf
将失败。您可以在此处使用char*
,这足以满足您的要求。
分配2*sizeof(double*)
并不能确保您能够保存双号的所有数字。那是个错误的想法。您可以考虑保持粗略值(如小数点后最多12位数),然后扫描它。
考虑malloc
的返回值是另一个好习惯。如果失败,则返回NULL
。在获得NULL
之后,如果继续访问它,则会调用未定义的行为。
无论您使用malloc
分配什么,在完成使用后都需要释放它。
还读了一些好书。有很多。
一个小例子:
#include <stdio.h>
#include <string.h>
#include <float.h>
#include <stdlib.h>
#include <ctype.h>
char *trimwhitespace(char *str)
{
char *end;
while(isspace((unsigned char)*str)) str++;
if(*str == 0)
return str;
end = str + strlen(str) - 1;
while(end > str && isspace((unsigned char)*end)) end--;
*(end+1) = 0;
return str;
}
int main()
{
const char *key="infinity";
char *str = malloc(sizeof(char)*(3 + DBL_MANT_DIG - DBL_MIN_EXP+1));
if( str == NULL){
fprintf(stderr,"Error in malloc");
exit(1);
}
char *store = str;
double a;
printf("Write the value: ");
if( fgets(str, (3 + DBL_MANT_DIG - DBL_MIN_EXP+1), stdin) == NULL){
fprintf(stderr,"Error in string input");
exit(1);
}
str = trimwhitespace(str);
if( strlen(str) == 0){
printf("Empty line detected.\n");
return EXIT_FAILURE;
}
for(size_t i = 1; i < strlen(str); i++){
if( !isspace(str[i]) && isspace(str[i-1])){
printf("Error extra input detected\n");
return EXIT_FAILURE;
}
}
if (strcmp(str,key)==0)
printf ("ok");
else
{
char *err;
a = strtod(str, &err);
if (*err!=0 && !isspace((unsigned char)*err)) {
printf("Error extra input detected ");
}
else{
printf("ok, a is %lf",a);
}
}
free(store);
return 0;
}
†找到一点后,我终于可以引用3 + DBL_MANT_DIG - DBL_MIN_EXP
部分的正确引用。请检查 answer 。