转换“a”的逻辑;char";变成一个;int";在C中
各位! 请帮助我理解以下问题。。。 所以我将有一个字符串类型的音符输入,看起来像“A5”或“G#2”或“Cb4”等,我需要提取一个倍频程索引,它是最后一个数字“5”或“2”或“4”。。。在交换之后,我需要它作为int类型 所以我这样做了:转换“a”的逻辑;char";变成一个;int";在C中,c,char,int,logic,atoi,C,Char,Int,Logic,Atoi,各位! 请帮助我理解以下问题。。。 所以我将有一个字符串类型的音符输入,看起来像“A5”或“G#2”或“Cb4”等,我需要提取一个倍频程索引,它是最后一个数字“5”或“2”或“4”。。。在交换之后,我需要它作为int类型 所以我这样做了: string note = get_string("Input: "); int octave = atoi(note[strlen(note) - 1]); printf("your octave is %i \n", octave); 但它给了我一个错误
string note = get_string("Input: ");
int octave = atoi(note[strlen(note) - 1]);
printf("your octave is %i \n", octave);
但它给了我一个错误“错误:不兼容的整数到指针转换将'char'传递给'const char*'类型的参数;使用&[-Werror,-Wint conversion]获取地址”
然后我试着从函数中推导出数学公式,并这样做:
int extnum = strlen(note) - 1;
int octave = atoi(note[extnum]);
但效果不太好。所以我研究了atoi函数,但我不明白
int octave = atoi(¬e[strlen(note) - 1]);
成功了!但我不明白为什么它和符号一起工作,没有符号就不能工作……因为它总是在没有符号的情况下工作!有一百万次我给了一个像“5”这样的字符串,我只是用了atoi,它工作得很好
请帮助我,为什么在这种情况下它的行为如此奇怪?函数
atoi
将指向字符数组的指针作为输入参数(const char*
)。调用note[strlen(note)-1]
时,这是一个字符(char
),为了使atoi
工作,您需要提供指针。您可以通过添加&
来完成此操作。这就行了,因为就在这一个数字之后,有一个空字符\0
终止了字符串-因为原始字符串是以空结尾的
但是请注意,这样做不是一个好主意:
char a = '7';
int b = atoi(&a);
由于无法确定内存中的下一个字节是什么(在属于
a
的字节之后),但函数仍将尝试读取它,这可能导致未定义的行为 最后一个字符是。。。一个角色!不是一串。因此,通过添加&
符号,您使其成为指向字符(char*
)的指针
您也可以尝试以下代码:
char a = '5';
int b = a - '0';
为您提供
5
的ASCII代码减去0的ASCII代码C没有本机字符串类型。字符串通常表示为字符数组或指向字符的指针
假设string
只是char*
的一个typedef
如果note
是字符数组,note[strlen(note)-1]
只是最后一个字符。由于atoi
需要指向char的指针(必须以null结尾),因此必须传递char的地址,而不是值
将一个字符数字转换为int的任务也可以更容易地解决:
int octave = note[strlen(note) - 1] - '0';
从中,atoi
的签名是:intatoi(constchar*nptr)代码>。因此,您需要传递char
的地址
执行此操作时:atoi(注意[strlen(注意)-1])
传递char
本身。因此,调用
当您使用&
时,您传递的是函数所期望的地址。因此,这是可行的。atoi
除了一个字符串(指向字符的指针),而不是一个字符
但是,您不应该使用atoi,因为该函数的错误处理能力很差。该功能100%等效,但更安全
您需要分两步执行此操作:
查找字符串中的第一个数字李>
从那里,通过调用strtol
将其转换为整数
1) 可以通过循环字符串来解决can问题,通过调用ctype.h中的isdigit
检查每个项目是否为数字。同时,检查字符串的结尾,即空终止符\0
。找到第一个数字后,保存指向该地址的指针
2) 通过将保存的指针传递到strtol
,例如result=strtol(指针,NULL,10),可以解决此问题
C没有本机字符串
类型。那么什么是字符串呢?'5'
不是“字符串”“5”
是一个“字符串”。所以magic&
不仅仅是一些随机符号,它是运算符的C地址,它给你一个指向某个东西的指针。C语言中的字符串经常使用指向字符的指针进行操作。因此,为了理解这里发生的事情,你必须学习更多关于C语言中字符串和指针的知识。你还需要考虑字符和字符串之间的区别:一个字符是一个单个字符,而一个字符串是由零个或多个字符组成的数组。具体来说,note
和note+strlen(note)-1
可以说是一个“字符串”(用某种说法)<代码>注释[strlen(note)-1]
是单个char
。