使用strtok

时间:2017-05-06 21:18:27

标签: c strtok atof

我正在尝试使用strtok()拆分字符串。我将浮点数作为字符串然后使用atof(),我将它们转换为浮点数,然后将它们放入另一个数组中。至少我在努力。我的代码就像:

int main() {
float new[4];
char inp[16]={"0.2 0.5 0.3 0.7"};

const char s[2] = " ";
char *token;
int i=0,j;

token=strtok(inp,s);
new[i]=atof(token);
i++;
while( token != NULL ) 
{  token = strtok(NULL, s);
  new[i]=atof(token);
  i++;
}
for(j=0;j<4;j++)
    printf("%f\n",new[j]);
} 

但我得到的错误如下:

[Error] expected unqualified-id before 'new'
[Error] expected type-specifier before '[' token
[Error] expected type-specifier before '[' token
[Error] expected type-specifier before '[' token

为什么我会收到这些错误?我无法使它工作但逻辑是真的吗? 对不起英语和结构错误,我是新用户:)

3 个答案:

答案 0 :(得分:0)

确保您使用的是C编译器而不是C ++编译器,否则您可能在命名varible new时遇到问题,因为它是一个关键字,例如在C语言中。

尽管如此,这些变化可以解决您的问题:

while( token != NULL ){
  token = strtok(NULL, s);
  if(token != NULL){
    new[i]=atof(token);
    i++;
  }
}

那是因为while不会测试每条指令上的标记是否为NULL,只是在执行循环之前。所以令牌它已经是NULL,但程序试图做atof(令牌)导致问题

答案 1 :(得分:0)

以下代码:

  1. 使用有意义的变量名称
  2. 执行正确的转换(atof()返回double,而不是float
  3. 不包含'魔术'数字
  4. 使用正确的逻辑来使用strtok()
  5. 使用适当的水平和垂直间距以提高可读性
  6. 遵循公理:每行只有一个语句,并且(最多)每个语句一个变量声明。
  7. 将数据声明保留在其使用范围内
  8. 使用size_t时值永远不会< 0,而不是int类型
  9. 允许编译器计算数组大小而不是硬编码值
  10. 包含必要的头文件
  11. 干净地编译
  12. 注意:使用`strtof()
  13. 时不会检查错误

    现在提出的代码

    #include <string.h>   // strtok()
    #include <stdio.h>    // printf()
    #include <stdlib.h>   // strtof()
    
    #define MAX_FLOATS 10
    
    int main( void )
    {
        float arrayOfFloat[ MAX_FLOATS ];
        char inp[]={"0.2 0.5 0.3 0.7"};
    
        const char delimiter[] = " ";
        char *token;
    
        size_t i=0;
        token=strtok( inp, delimiter );
        while( token )
        {
            arrayOfFloat[i] = strtof( token, NULL );
            i++;
            token = strtok( NULL, delimiter );
        }
    
        for( size_t j=0; j<i; j++ )
            printf("%f\n", arrayOfFloat[j]);
    } // end function: main
    

    运行建议代码的结果是:

    0.200000
    0.500000
    0.300000
    0.700000
    

答案 2 :(得分:-1)

很简单,只需将'new'更改为任何变量名即可[check sample]。真的不知道这是否是保留字,请相信我,这是造成您问题的原因。