我是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/

10-09 06:33
查看更多