【发布时间】:2018-08-08 11:18:57
【问题描述】:
大家!
请帮助我理解以下问题... 所以我会有一个字符串类型的音符输入,看起来像“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);
但是它给了我一个错误“错误:不兼容的整数到指针转换将'char'传递给'const char *'类型的参数;使用& [-Werror,-Wint-conversion]获取地址”
然后我尝试从函数中排除数学,然后这样做:
int extnum = strlen(note) - 1;
int octave = atoi(note[extnum]);
效果也不好。所以我对 atoi 函数进行了研究,但我不明白......
- ATOI 需要一个字符串 (CHECK)
- 将其转换为整数,而不是 ASCII 含义 (CHECK)
- atoi 函数库 (CHECK)
我基本上在问“取该字符串的第 n 个字符并将其设为 int”。
在谷歌上搜索了一段时间后,发现了另一个代码示例,其中一个人使用带有此符号“&”的 atoi。 所以我这样做了:
int octave = atoi(¬e[strlen(note) - 1]);
它成功了!但我不明白为什么它与 & 符号一起使用而没有它就不起作用....因为它总是在没有它的情况下工作!有一百万次我给出了一个像 '5' 这样的单字符串,只是使用了 atoi 并且它工作得很好......
请帮帮我,为什么在这种情况下它表现得如此奇怪?
【问题讨论】:
-
C 没有原生的
string类型。那么什么是字符串呢? -
'5'不是“字符串”。"5"是一个“字符串”。 -
所以
&的神奇之处不仅仅是一些随机符号,它是 C 的地址操作符,它为您提供指向某物的指针。 C 中的字符串经常使用指向字符的指针来操作。所以要理解这里发生了什么,你将不得不更多地了解 C 中的字符串和指针。你还需要考虑字符和字符串之间的区别:字符是单个字符,而字符串是数组零个或多个字符。 -
具体来说,
note和note + strlen(note) - 1可以说是一个“字符串”(某种说法);note[strlen(note) - 1]是单个char。