繁体   English   中英

从字符串中提取一个字符并将其转换为c中的int

[英]Take a character from a string and convert it to int in c

我是c语言的新手,尝试编写一个控制台应用程序,该应用程序从用户的音乐项目中获取时间签名和BPM信息,并返回以秒为单位的一个小节的长度。

我想将用户输入的字符串用于时间签名(例如:“ 4/4”),隔离第一个字符(表示每个小节拍数的数字),然后将其转换为要在计算中使用的整数。

我尝试过的两种方法

int beatsPerBar = timeSignature[0];

int beatsPerBar = atoi(timeSignature[0])

两者都返回相同的错误:“下标值既不是数组,也不是指针,也不是向量”。

如何正确更改此字符的变量类型?

编辑:

使用@ R-Sahu的建议。 下面的代码编译并生成没有错误或警告。

#include <stdio.h>
#include <stdlib.h>

int main()
{

   char timeSignature[4];
   int BPM;

   printf("Enter the working time signature of your project:");
   scanf("%s",&timeSignature[4]);

   int beatsPerBar = timeSignature[0]-'1';

   printf("Enter the beats per minute:");
   scanf("%i",&BPM);

   printf("%i\n", beatsPerBar);

   return 0;

}

但是,当我使用以下值测试代码时

timeSignature = "4/4"
    BPM = 180

我得到的结果是-47整数(计算器检查说应该返回45 )。

我究竟做错了什么? 显然,我对编码以及用于表示字符值的整数的理解并不应该。 任何人都可以共享指向该主题的广泛教程的链接吗?

用于

int beatsPerBar = atoi(timeSignature[0])

应该会导致编译器错误。 atoi的输入参数类型是char const* ,而timeSignature[0]不是。

int beatsPerBar = timeSignature[0];

在语法上是正确的,但在语义上是错误的。 这会将beatsPerBar的值设置为用于表示字符4的整数值。 如果您的平台使用ASCII编码,则该值为52

您应该使用:

int beatsPerBar = timeSignature[0] - '0';

获取分配给beatsPerBar的数字4

如果您想更加小心,应该添加以下检查。

int beatsPerBar = 0;
if ( isdigit(timeSignature[0]) )
{
   beatsPerBar = timeSignature[0] - '0';
}
else
{
   // Deal with error.
}

正如@ r-sahu所说:

atoi的输入参数类型为const char *

因此,如果您仍想使用atoi,可以将char转换为字符串,然后按以下方式使用atoi(例如):

if (isdigit(timeSignature[0]))
  char dig[2]= {timeSignature[0],'\0'};
  int beatsPerBar = atoi(dig);

无需使用atoi ,只需将char转换为int 例如

int beatsPerBar = timeSignature[0] - '0';

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM