我想将一个字符串解析成一个音符和八度音阶。例如,如果用户输入“A#4”,(A#) - 注意将存储在(char n)和(4) - 八度音程中,将存储在(char o)中。为什么在A#?
之后我得到空白行而不是4作为输出#include <cs50.h>
#include <stdio.h>
#include <string.h>
int main()
{
string src = get_string();
char *n;
char *o;
char *note = "ABCDEFG#b";
char *octave = "12345678";
o = strtok(src, note);
n = strtok(src, octave);
printf("%s\n", n);
printf("%s\n", o);
}
输出:
A#
你能指出错误并建议解决方案吗?
答案 0 :(得分:2)
strtok
不是您要在此实例中使用的函数。
当你调用它时,它会改变字符串,用NUL
替换与分词符匹配的字符,这样你就会丢失你想要的字符作为音符。第二次使用src
调用它时,字符串将显示为空并且找不到任何内容 - 您打算在后续时间调用它,并将第一个参数设置为NULL
,以便它知道你在同一个字符串中搜索下一个标记。
您可能希望使用strspn
来计算与您的集合匹配的字符数(即note
)或strpbrk
,以查找匹配的第一个字符。
或者你可以自己遍历字符串并像这样使用strchr
char *pos;
for(pos=src;*pos!='\0';pos++)
{
if(strchr(note,*pos))
{
// *pos is a note character
}
}
无论你使用什么,你都需要根据你的结果建立一个新的字符串,因为原始字符串没有空间将NUL
终止符放在里面以分离你正在寻找的两个部分。