这是我的代码。用户输入一个字符串,如果输入是1,2或*则显示错误。问题是条件满足所有数字,其中第一个数字是1,2 amd 3 。(11,12,22 ...)。我还使用了strlen和sizeof函数来计算数字并创建一个有效的条件但是当我打印strlen时,每个数字的输出都是1。
我不明白问题是我的多重条件还是使用scanf
这是我的代码
#include < stdio.h >
int main (void)
{
char choice;
int i=0;
do
{
scanf("%s", &choice);
while(choice !='1' && choice !='2' && choice !='*' )
{
printf("error");
scanf("%s",&choice);
}
}while (choice !='0');
return 0;
}
我会非常感谢任何帮助。我是编程新手,如果问题很愚蠢,请原谅我。
答案 0 :(得分:1)
考虑使用fgets
获取输入,然后使用sscanf
进行解析。使用int choice
可以区分1到11 ...
#include <stdio.h>
int main( void) {
char input[99] = "";
int choice = 0;
do {
printf ( "Enter 0 to quit\n");
if ( fgets ( input, sizeof input, stdin)) {
if ( 1 == sscanf ( input, "%d", &choice)) {
if ( choice == 1 || choice == 2 || choice == 3) {
printf ( "error\n");
}
else {
printf ( "you entered %d\n", choice);
}
}
else {
if ( 0 == strcmp ( input, "*\n")) {
printf ( "error\n");
}
//sscanf could not parse an int
choice = -1;
}
}
else {
break;// fgets failed
}
} while ( choice != 0);
return 0;
}
答案 1 :(得分:1)
我建议您使用以下代码:
#include <stdio.h>
#include <string.h>
int main (void)
{
char choice[201];
do
{
scanf("%200s", choice);
if (strcmp(choice, "1") == 0 ||
strcmp(choice, "2") == 0 ||
strcmp(choice, "3") == 0)
printf("error");
} while (strcmp(choice, "0") != 0);
return 0;
}
%s
等待char *
参数,你的&choice
是正确的,但是scanf会在指向的地址写一个完整的字符串,它可以(将)包含多个char 。通过给出char变量的地址,您只为一个char提供了空间。
你不能用比较运算符比较字符串,你必须使用strcmp
函数,如果它的两个参数匹配则返回0,否则返回非零。
如果我理解你的意图,就不需要两个嵌套的while循环。也不需要进行两次scanf
次调用。
200
scanf格式字符串中的%200s
,限制将在您提供地址的数组中写入的字符数。
此数组的大小为201
,以计算额外的'\ 0'字节,终止C字符串。
要正确编写此代码,应测试scanf的返回,以检查是否已成功解析某些内容。 请参阅scanf的手册页,了解如何检查解析是否成功。
答案 2 :(得分:1)
您已将choice
声明为char
个对象 - 它只能存储单个字符值。如果您在输入时输入"123"
之类的字符串,则只有前导'1'
存储到choice
,其余输入会在choice
之后立即写入内存,如果你破坏任何重要的东西,可能导致运行时错误。
如果要将输入读取并存储为字符串字符,则需要将choice
声明为char
的数组 },大小至少至少比最大输入大小多一个字符 - IOW,如果您希望最大字符串长度为3个字符,那么choice
必须声明为{{1} }}
如果要将输入读取并存储为整数,则必须将选项声明为char choice[4];
而不是int
,并且需要使用{{ 1}}转换说明符而不是char
。
答案 3 :(得分:0)
以下提议的代码:
scanf()
现在是代码:
#include <stdio.h> // scanf(), printf(), perror()
#include <stdlib.h> // exit(), EXIT_FAILURE
int main (void)
{
char choice;
do
{
printf( "enter 0:" );
if( 1 != scanf(" %c", &choice) )
{
perror( "scanf failed" ); // to stderr:
// enclosed text + reason OS thinks it failed
exit( EXIT_FAILURE ); // once failed, it will continue to fail
// so exit program with error indication
}
// implied else, scanf successful
// what about other user inputs?
if(choice !='1' && choice !='2' && choice !='*' )
{
printf("error\n"); // trailing '\n'
// so immediately displayed on terminal
// note: should use: 'fprintf( stderr, ... )'
// because error messages should
// be output to 'stderr', not 'stdout'
}
} while (choice !='0');
return 0;
} // end function: main