【问题标题】:Turn first part of string into a number in C将字符串的第一部分转换为C中的数字
【发布时间】:2013-06-24 09:47:27
【问题描述】:

我有一个如下所示的字符串:

原子 3760 CB GLU B 208 21.707 20.319 45.764 0.0000 2.2350

我从一个文件中读取它。

我想把 208 变成一个 int。请注意,数字可能是 11208,在这种情况下,将占用 208 之前的两个空格。我正在尝试以下操作,但我不断遇到设置错误。想法?

char* line = NULL;
size_t len = 0;

int res_num;

while (getline (&line, &len, fp) != -1)
{

    sprintf(res_num,"%5.1d",atoi(line+22));
    printf("%d\n",res);

}

【问题讨论】:

  • 你应该拆分你的 char* 然后使用 atoi 来获取值
  • 你也可以使用 sscanf 来扫描和分割字符串。

标签: c string parsing int


【解决方案1】:

您遇到了分段错误,因为您传递了一个未初始化的整数 (res_num) 的值,其中 sprintf() 需要目标字符串缓冲区的地址。

您可以使用strtol() 将字符串转换为整数,或使用atoi()。这不是问题,问题在于您的sprintf() 调用的随机内存覆盖。

同样printf() 引用了一个未知变量res;你确定上面的代码已经编译了吗?

你可以放弃sprintf(),直接使用printf()

printf("found %d\n", atoi(line + 22));

或者,当然,将数字存储在变量中以供进一步处理:

const int res = atoi(line + 22);

printf("by the way, res=%d\n", res);

【讨论】:

  • 抱歉 printf 应该是 printf("%d\n",res);
  • printf("%5.1d\n",atoi(line+22));给我我需要的数字,但如何将它分配给变量?
  • res_num = atoi(line + 22);
  • 成功了!谢谢!不过出于好奇,没有指定空格的数量来考虑它是如何知道数字的大小的。例如,在 sprintf 中,对您感兴趣的字符串块非常挑剔。
猜你喜欢
  • 1970-01-01
  • 2015-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-22
  • 2021-06-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多