【问题标题】:Parse a string and assign it to different char解析字符串并将其分配给不同的字符
【发布时间】:2018-07-09 10:33:52
【问题描述】:

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

您能否指出错误并提出解决方案?

【问题讨论】:

  • man strtok 应该是你的朋友。抱歉,C 标准库附带了一个很好的文档。我很乐意帮助你,但请先 RTFM...
  • 如果你稍微搜索一下,应该有很多关于如何使用strtok 的资源、参考资料和示例。你需要它是因为你没有正确使用它。事实上,你不应该真正使用它根本,因为它不会做你希望它做的事情。相反,您应该遍历输入字符串,并手动查找音符结束和八度开始的位置。

标签: c string parsing cs50


【解决方案1】:

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 终结符放入其中以分离出您要查找的两个部分。

【讨论】:

    猜你喜欢
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 2018-09-20
    • 2017-04-04
    • 2016-06-11
    • 2013-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多