如何从C中的字符串转换整数?
最简单的方法是什么?我需要程序功能,如:
fraction create_fraction_from_string(char *str)
我将在主文件中调用如下函数:
fraction create_fraction_from_string("-12/4")
,结果应该是两个整数:
int a = -12;
int b = 4;
我认为,我拆分字符串,然后转换这两个字符串…我是C编程新手…
编辑:
分数是:
typedef struct { int a; int b; } fraction;
输入总是在"x/y"或"- x/y"
结果应该是:
fraction res = { .a = -12, .b = 4 };
@David写了一个非常通用的答案,在某些情况下可能很有用。但为了简单起见,这里有一个更具体的变体:
int create_fraction_from_string (fraction *frac, const char *str)
{
const char *fmt = "%d/%d";
return (sscanf (str, fmt, &frac->a, &frac->b) == 2);
}
这将返回1表示成功,0表示失败,所以您需要在使用frac
之前检查转换是否工作。
从评论中收集智慧,您读取任何需要从输入中解析值的输入的基本方法是:
- 使用
fgets()
将整行输入读入足够大小的缓冲区,不要在缓冲区大小上忽略。验证返回,以确保您有有效的输入和用户没有取消输入生成手动EOF
按Ctrl + d(或Ctrl + z在windows上), - 使用
sscanf()
解析输入所需的值。验证返回以确定请求的每个转换是否成功。否则,处理错误。
对于函数create_fraction_from_string()
,您需要更改返回类型,以便返回可以指示从输入的转换是成功还是失败。您可以将bool
用于true/false
指示,或者简单地将int
与0/1
一起用于相同的目的。你可以传递fraction
的地址,并在函数中更新指针地址处的值,并使这些值在调用者中可用。
然后在调用程序(这里是main()
)中,在尝试输出值之前验证create_fraction_from_string()
的返回值。如果您试图通过在声明时完全初始化结构来输出分数,则可以确保避免UB (未定义行为)。无论使用如下所示的命名初始化方法,还是仅为每个成员指定一个值,结果都是相同的。
把它们放在一起,你可以做类似的事情:
#include <stdio.h>
#define FRACFMT "%d/%d" /* if you need a constant, #define one (or more) */
#define FRACCNV 2
typedef struct {
int a, b;
} fraction;
/* fill frac from str using sscanf (str, fmt, ...), validate nconv
* conversions. Returns 1 on success, O otherwise.
*/
int create_fraction_from_string (fraction *frac, const char *str,
const char *fmt, const int nconv)
{
/* parse fmt from string into frac->a, frac->b, validate nconv */
if (sscanf (str, fmt, &frac->a, &frac->b) != nconv) {
return 0; /* return failure */
}
return 1; /* return success */
}
int main (void) {
/* BUFSIZ 4096 on Linux, 512 on Windows */
char line[BUFSIZ]; /* buffer to hold line of input */
fraction frac = { .a = 0 }; /* fraction to hold result */
fputs ("enter fraction ("int/int"): ", stdout); /* prompt */
if (!fgets (line, BUFSIZ, stdin)) { /* read into buffer, validate */
puts ("(user canceled input)"); /* handle manual EOF */
return 0;
}
/* call create_fraction_from_string(), validate return */
if (!create_fraction_from_string (&frac, line, FRACFMT, FRACCNV)) {
fputs ("error: invalid input, must be "int / int".n", stderr);
return 1;
}
/* output result */
printf ("nfrac.a : %dnfrac.b : %dn", frac.a, frac.b);
}
(注意:显然,你应该检查分母是不是create_fraction_from_string()
中的0
——这是留给你的)
使用/输出示例
$ ./bin/readfraction
enter fraction ("int/int"): -12/4
frac.a : -12
frac.b : 4
看一遍,有问题就告诉我。