如何使用strtok打印二进制数?

时间:2016-09-29 14:39:30

标签: c input whitespace scanf strtok

所以我试图通过使用strtok函数来迭代用户输入的字符串来获取二进制数。如果用户输入alpha,则输出0,如果用户输入beta,则输出1.如果用户键入" alpha beta alpha beta alpha"输出应为" 01010"。我有以下代码,但我不知道我哪里出错,因为它没有做我描述的行为

#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

#include <string.h>
int main(int argc, char * argv[])
{
    char userinput[250];
    long binaryarray[250];
    char *token;
    int counter = 0;
    long binarynumber = 0 ;
    printf("enter alpha or beta");
    scanf("%s", userinput);
    token = strtok(userinput, " ");
    while (token != NULL)
    {
        if(!strcmp(token, "alpha"))
        {
            binaryarray[counter] = 0;
            counter += 1;
        }
        if(!strcmp(token, "beta"))
        {
            binaryarray[counter] = 1;
            counter += 1;
        }
        token = strtok(NULL, " \0");
    }
    for(int i = 0; i < counter; i++)
    {
        binarynumber = 10 * binarynumber + binaryarray[i];
    }
    printf("%ld", binarynumber);
}

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

问题是,对于

  scanf("%s",userinput);
扫描在遇到第一个空格后停止。因此,它无法扫描和存储输入,如

  

alpha beta alpha beta alpha

由空格分隔。引用C11,章节§7.21.6.2

  

s

     

匹配一系列非空白字符。

可能的解决方案:您需要使用fgets()来读取带有空格的用户输入。

答案 1 :(得分:0)

正如@SouravGhosh所说,您应该使用fgets来存储用户使用空格插入的整个字符串。

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

int main(int argc, char * argv[])
{
    char userinput[250] = {0};
    char binaryarray[250];
    char* token;
    size_t counter = 0;

    printf("enter alpha or beta");
    fgets(userinput, sizeof(userinput), stdin);

    token = strtok(userinput, " \n\0");

    while (( token != NULL) && (count < sizeof(binaryarray)))
    {
        if(!strcmp(token,"alpha"))
        {
            binaryarray[counter] = '0';
            counter++;
        }
        else if(!strcmp(token,"beta"))
        {
            binaryarray[counter] = '1';
            counter++;
        }
        token = strtok(NULL, " \n\0");
    }

    for(size_t i=0 ; i< counter; i++)
    {
        printf("%c", binaryarray[i]);
    }

    printf("\n");
}

但你还有其他问题:

  1. 您的令牌应为" \n\0",以匹配单词之间所有可能的字符。
  2. 如果是单个输入,则必须使用第一个条目检查所有标记,因此没有空格
  3. 使用int来计算你的&#34;二进制&#34;并使用"%ld"格式说明符打印它不会打印前导零。您可以直接将字符存储到缓冲区中。