如何在C中从字符串整数转换?

  • 本文关键字:字符串 整数 转换 c
  • 更新时间 :
  • 英文 :


如何从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之前检查转换是否工作。

从评论中收集智慧,您读取任何需要从输入中解析值的输入的基本方法是:

  1. 使用fgets()将整行输入读入足够大小的缓冲区,不要在缓冲区大小上忽略。验证返回,以确保您有有效的输入和用户没有取消输入生成手动EOFCtrl + d(或Ctrl + z在windows上),
  2. 使用sscanf()解析输入所需的值。验证返回以确定请求的每个转换是否成功。否则,处理错误。

对于函数create_fraction_from_string(),您需要更改返回类型,以便返回可以指示从输入的转换是成功还是失败。您可以将bool用于true/false指示,或者简单地将int0/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

看一遍,有问题就告诉我。

最新更新