Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从字符串中提取一个字符,并在c中将其转换为int_C_String - Fatal编程技术网

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

从字符串中提取一个字符,并在c中将其转换为int,c,string,C,String,我是c新手,尝试编写一个控制台应用程序,从用户的音乐项目中获取时间签名和BPM信息,并以秒为单位返回一个小节的长度 我想将用户输入字符串作为时间签名(例如:“4/4”),分离出第一个字符(一个表示每小节拍数的数字),并将其转换为一个整数,以便在计算中使用 我试过的两种方法 int beatsPerBar = timeSignature[0]; 及 两者都返回相同的错误:“下标值既不是数组,也不是指针,也不是向量” 如何正确更改此字符的变量类型 编辑: 使用@R-Sahu的建议。下面的代码编译和

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

我想将用户输入字符串作为时间签名(例如:“4/4”),分离出第一个字符(一个表示每小节拍数的数字),并将其转换为一个整数,以便在计算中使用

我试过的两种方法

int beatsPerBar = 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;

}
我得到的结果是
-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,可以将字符转换为字符串,然后使用atoi,如下所示(例如):


无需使用
atoi
,只需将
char
转换为
int
。比如说

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

他们“返回错误…”?不大可能发生的你的意思是你得到了一个编译器错误/警告。请提供一个.Oh,并且您不能更改变量的类型(即使在动态类型语言中也不能)。不要忘记像10/8这样的时髦时间签名。@NathanielLindsey,您有问题吗?顺便说一句,
timeSignature[0]-“1”
将给您错误的结果。请参阅对我原始问题的编辑。我无法将其浓缩到一条评论中。@NathanielLindsey,
scanf(“%s”,&timeSignature[4])不正确。它将
timeSignagure
的最后一个元素的地址传递给
scanf
。您最终会访问超出边界的数组。使用
scanf(“%s”和时间签名[0]),或简单地
scanf(“%s”,时间签名)我得到的输出值不正确,因此我使用原始问题编辑中的相同测试值运行了以下测试,以确认“timeSignature[0]”的整数值:int main(){char timeSignature[4];printf(“输入项目的工作时间签名:”);scanf(“%s”,timeSignature);int beatsPerBar=timeSignature[0]-“0”;printf(“%i”,beatsPerBar);返回0;}返回值为“3”,而不是我需要的“4”,但当我未能减去“0”字符时,返回值变为52。再说一遍,我做错了什么?(为什么我的代码格式没有显示?@NathanielLindsey,您得到的是
3
而不是
4
,因为您使用的是
timeSignature[0]-“1”
。这应该是
timeSignature[0]-“0”
int beatsPerBar = 0;
if ( isdigit(timeSignature[0]) )
{
   beatsPerBar = timeSignature[0] - '0';
}
else
{
   // Deal with error.
}
if (isdigit(timeSignature[0]))
  char dig[2]= {timeSignature[0],'\0'};
  int beatsPerBar = atoi(dig);
int beatsPerBar = timeSignature[0] - '0';