我是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';
获取分配给
4
的数字。如果你想更加小心,你应该,你可以添加以下检查。
int beatsPerBar = 0;
if ( isdigit(timeSignature[0]) )
{
beatsPerBar = timeSignature[0] - '0';
}
else
{
// Deal with error.
}
关于c - 从字符串中提取一个字符并将其转换为c中的int,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32236867/