在C问题中将字符串转换为浮点?

在C问题中将字符串转换为浮点?,c,C,所以我有一个C程序,您可以在命令行提示下键入名称、年龄和高度,然后将这些参数写入一个文本文件,然而,对于高度(这是一个浮点),存在一个问题。它会写下一个非常高的值,而不是您键入的值。我觉得记忆有问题或者类似的问题 #include <stdio.h> #include <string.h> int main(int argc, char *argv[]) { if (argc != 4) { printf("Please enter four p

所以我有一个C程序,您可以在命令行提示下键入名称、年龄和高度,然后将这些参数写入一个文本文件,然而,对于高度(这是一个浮点),存在一个问题。它会写下一个非常高的值,而不是您键入的值。我觉得记忆有问题或者类似的问题

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[]) {
    if (argc != 4) {
        printf("Please enter four parameters");
        return;
    } else {
        char name[20];
        strcpy(name, argv[1]);
        int age = atoi(argv[2]);
        double height = atof(argv[3]);
        FILE *fp;

        fp = fopen("name.txt", "w+");
        fprintf(fp, "%s\n%d\n%.2f", name, age, height);
        fclose(fp);

        printf("File written!");

        return 0;
    }
}
#包括
#包括
int main(int argc,char*argv[]){
如果(argc!=4){
printf(“请输入四个参数”);
返回;
}否则{
字符名[20];
strcpy(名称,argv[1]);
int age=atoi(argv[2]);
双倍高度=atof(argv[3]);
文件*fp;
fp=fopen(“name.txt”,“w+”);
fprintf(fp,“%s\n%d\n%.2f”,姓名、年龄、身高);
fclose(fp);
printf(“文件已写入!”);
返回0;
}
}

那么,我对
浮动高度做了什么错误呢?

在使用
atoi()
atof()
之前,您必须包含正确的标题(
stdlib.h
)或声明函数

还要注意

  • 使用
    返回(返回语句没有返回值)在非void函数中不好
  • 您应该检查
    fopen()
    是否成功
试试这个:

#include <stdio.h>
#include <stdlib.h> /* add this */
#include <string.h>

int main(int argc, char *argv[]) {
    if(argc != 4) {
        printf("Please enter four parameters");
        return 1; /* add a return value */
    }
    else {
        char name[20];
        strcpy(name, argv[1]);
        int age = atoi(argv[2]);
        double height = atof(argv[3]);
        FILE *fp;

        fp = fopen("name.txt", "w+");
        if(fp == NULL) { /* add error check */
            perror("fopen");
            return 1;
        }
        fprintf(fp, "%s\n%d\n%.2f", name, age, height);
        fclose(fp);

        printf("File written!");

        return 0;
    }
}
#包括
#包括/*添加此*/
#包括
int main(int argc,char*argv[]){
如果(argc!=4){
printf(“请输入四个参数”);
返回1;/*添加一个返回值*/
}
否则{
字符名[20];
strcpy(名称,argv[1]);
int age=atoi(argv[2]);
双倍高度=atof(argv[3]);
文件*fp;
fp=fopen(“name.txt”,“w+”);
如果(fp==NULL){/*添加错误检查*/
佩罗尔(“福彭”);
返回1;
}
fprintf(fp,“%s\n%d\n%.2f”,姓名、年龄、身高);
fclose(fp);
printf(“文件已写入!”);
返回0;
}
}

如果您展示了您使用的命令行参数以及输出文件的内容,这将非常有用。另外,您不应该返回无值,您应该返回1以指示错误。并确保你
#包括
使用
atoi()
atof()
。这是我多年来见过的最好答案!感谢您提供了如此清晰、信息丰富的答案,并感谢您在其他方面更正了我的代码,作为奖励!:)那种毫无防备的strcpy在大多数公司都会遭到解雇。@KerrekSB我是一个学习C语言的新手,不是一个专业的C语言程序员。“保护”strcpy意味着什么?@HJGBAUM:打开所有编译器警告:
gcc-Wall-Wextra-Werror
,或
clang-Weverything-Werror
。。。这可以避免许多愚蠢的错误,比如发布的代码中的错误。@HJGBAUM如果
argv[1]=“1234567890012345678901234567890”
,你认为
字符名[20]会发生什么;strcpy(名称,argv[1])