如何使用 strtok 打印二进制数?
how to use strtok to print a binary number?
所以我试图通过使用 strtok 函数循环访问用户输入的字符串来获取二进制数。如果用户输入 alpha,它会打印 0;如果用户输入 beta,它会输出 1.So;如果用户输入 "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, " [=10=]");
}
for(int i = 0; i < counter; i++)
{
binarynumber = 10 * binarynumber + binaryarray[i];
}
printf("%ld", binarynumber);
}
我该如何解决这个问题?
问题是,
scanf("%s",userinput);
扫描 在遇到第一个空格后停止。因此,它无法扫描和存储像
这样的输入
alpha beta alpha beta alpha
以空格分隔。引用 C11
,章节 §7.21.6.2
s
Matches a sequence of non-white-space characters.
可能的解决方案:您需要使用fgets()
读取带有空格的用户输入。
正如@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[=10=]");
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[=10=]");
}
for(size_t i=0 ; i< counter; i++)
{
printf("%c", binaryarray[i]);
}
printf("\n");
}
但是你还有其他问题:
- 您的标记应
" \n[=12=]"
以匹配单词之间所有可能的字符。
- 在单个输入的情况下,必须用第一个笔划检查所有标记,因此没有空格
- 使用 int 计算您的 "binary" 并使用
"%ld"
格式说明符打印它不会打印前导零。您可以直接将字符存储到缓冲区中。
所以我试图通过使用 strtok 函数循环访问用户输入的字符串来获取二进制数。如果用户输入 alpha,它会打印 0;如果用户输入 beta,它会输出 1.So;如果用户输入 "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, " [=10=]");
}
for(int i = 0; i < counter; i++)
{
binarynumber = 10 * binarynumber + binaryarray[i];
}
printf("%ld", binarynumber);
}
我该如何解决这个问题?
问题是,
scanf("%s",userinput);
扫描 在遇到第一个空格后停止。因此,它无法扫描和存储像
这样的输入alpha beta alpha beta alpha
以空格分隔。引用 C11
,章节 §7.21.6.2
s
Matches a sequence of non-white-space characters.
可能的解决方案:您需要使用fgets()
读取带有空格的用户输入。
正如@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[=10=]");
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[=10=]");
}
for(size_t i=0 ; i< counter; i++)
{
printf("%c", binaryarray[i]);
}
printf("\n");
}
但是你还有其他问题:
- 您的标记应
" \n[=12=]"
以匹配单词之间所有可能的字符。 - 在单个输入的情况下,必须用第一个笔划检查所有标记,因此没有空格
- 使用 int 计算您的 "binary" 并使用
"%ld"
格式说明符打印它不会打印前导零。您可以直接将字符存储到缓冲区中。