[英]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.