0

我一直在尝试使用 strtok 来编写多项式微分程序,但它的行为似乎很奇怪。在这一点上,我已经告诉它在字符 ' '、[、]、( 和 ) 处停止。但是由于某种原因,当传递诸如“Hello[]”之类的输入时,它会返回“Hello\n”

我的代码有什么问题吗?所有多项式字符串都是文本“Hello []”

void differentiate(char* polynomial) 
{
    char current[10];
    char output[100];

    strncpy(current, strtok(polynomial, " []()/\n"), 10);
    printf("%s", current);

} // differentiate()

编辑:这似乎是一个与 shell 相关的问题,而且它似乎也不是换行符,因为当我使用 bash 时它不会发生,但是当我使用 fish 时,我得到以下信息:

在此处输入图像描述

我以前从未见过这种东西,有人有什么建议吗?这只是鱼的怪癖吗?

4

1 回答 1

2

我将您的代码转换为这个 SSCCE(简短、独立、正确的示例):

#include <string.h>
#include <stdio.h>

static
void differentiate(char* polynomial) 
{
    char current[10];

    strncpy(current, strtok(polynomial, " []()/\n"), 10);
    printf("<<%s>>\n", current);

}

int main(void)
{
    char string[] = "Hello[]";
    printf("Before: <<%s>>\n", string);
    differentiate(string);
    printf("After:  <<%s>>\n", string);
    return 0;
}

实际输出:

Before: <<Hello[]>>
<<Hello>>
After:  <<Hello>>

我在 Mac OS X 10.8.4 上使用 GCC 4.8.1 进行测试,但使用 Apple 提供的 GCC ( i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)) 和clang( Apple LLVM version 4.2 (clang-425.0.28) (based on LLVM 3.2svn)) 得到了相同的结果。

您应该strtok()通过调整此测试并显示输出来证明您的断言是正确的。注意代码如何使用<<and>>来包围它正在打印的字符串;如果那里有换行符,它将显示在双尖括号内。

于 2013-09-02T01:42:14.310 回答