解析一个字符串并将其分配给不同的char

时间:2018-01-30 13:54:28

标签: c string parsing cs50

我想将一个字符串解析成一个音符和八度音阶。例如,如果用户输入“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#

你能指出错误并建议解决方案吗?

1 个答案:

答案 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终止符放在里面以分离你正在寻找的两个部分。