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

C 如何使用strtok打印二进制数?,c,input,whitespace,scanf,strtok,C,Input,Whitespace,Scanf,Strtok,因此,我试图通过使用strtok函数迭代用户输入的字符串来获得一个二进制数。如果用户输入alpha,则打印0,如果用户输入beta,则输出1。因此,如果用户输入“alpha beta alpha”,则输出应为“01010”。我有下面的代码,但我不确定我哪里出了问题,因为它没有做我描述的行为 #include <math.h> #include <stdio.h> #include <stdlib.h> #include <stdint.h> #i

因此,我试图通过使用strtok函数迭代用户输入的字符串来获得一个二进制数。如果用户输入alpha,则打印0,如果用户输入beta,则输出1。因此,如果用户输入“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);
}
#包括
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
字符用户输入[250];
长二进制数组[250];
字符*令牌;
int计数器=0;
长二进制数=0;
printf(“输入α或β”);
scanf(“%s”,用户输入);
token=strtok(userinput,“”);
while(令牌!=NULL)
{
如果(!strcmp(标记,“alpha”))
{
二进制数组[计数器]=0;
计数器+=1;
}
如果(!strcmp(令牌,“beta”))
{
二进制数组[计数器]=1;
计数器+=1;
}
令牌=strtok(空,“\0”);
}
对于(int i=0;i
如何解决此问题?

问题是

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

α-β-α-β-α

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

s

匹配一系列非空白字符


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

正如@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");
}
#包括
#包括
int main(int argc,char*argv[])
{
char userinput[250]={0};
字符二进制数组[250];
字符*令牌;
计数器的大小=0;
printf(“输入α或β”);
fgets(userinput,sizeof(userinput),stdin);
令牌=strtok(userinput,“\n\0”);
而((token!=NULL)&&(count
但你还有其他问题:

  • 您的令牌应该是
    “\n\0”
    ,以匹配单词之间所有可能的字符
  • 在单个输入的情况下,必须使用第一个strok检查所有标记,所以没有空格
  • 使用int计算“二进制”并使用
    %ld”
    格式说明符打印它不会打印前导零。您可以直接将字符存储到缓冲区中
    并且不会打印前导零。最好构造一个由
    '0'
    '1'
    字符组成的字符串,而不是将其转换成一个看起来像二进制数的十进制数。或者在执行时只打印数字,而不是将其存储起来,以便在最后一次全部打印。@JohnBollinger所以我尝试在strcmp函数和它仍然只打印出1digit@h101这是在做了这个答案中建议的更改之后吗?好的,是的,fgets最终解决了我的问题,它现在按预期工作。好的,我刚刚发布了实际的代码。那么,我如何修改代码,以便它总是先为二进制数打印一个1,而不管是alpha还是beta打电话。例如,alpha-beta将是二进制101,而beta-alpha将是1110char二进制数组[250]={'1'};int计数器=1;有没有电子邮件我可以问你一个问题?由于某些原因,我有一些问题,由于学术政策,我不允许发布我的所有代码。对不起,我不想发布我的任何电子邮件帐户。尝试用不同的代码复制代码并发布。