我是c语言的新手,我的代码遇到了一些问题。我必须制作一个程序来计算出租汽车的价格,但是while循环不能正常运行。在while条件之上的scanf是%s而不是%c,因为当它是%c时它不会让我给出一个字符。请提前告诉你。
int main(){
float skms, ekms, tkms, price;
char catcode;
int days;
do{
printf("Selected rental program:\n");
scanf("%c",&catcode);
printf("Enter number of days:\n");
scanf("%d",&days);
printf("Starting kilometers display:\n");
scanf("%f",&skms);
printf("Kilometers display at end of rent:\n");
scanf("%f",&ekms);
tkms=(ekms/10)-(skms/10);
switch(catcode){
case'a':
case'A':
price=ammountDueA(days, tkms);
printf("%.2f\n",price);
break;
case'b':
case'B':
price=ammountDueB(days, tkms);
printf("%.2f\n",price);
break;
case'c':
case'C':
price=ammountDueC(days, tkms);
printf("%.2f\n",price);
}
printf("Select rental program.('Q' or 'q' to exit)\n");
scanf("%s",&catcode);
}while(catcode==!'Q'&&catcode==!'q');
printf("%c",catcode);
return 0;
}
答案 0 :(得分:1)
通过"不工作",我想你的意思是它永远不会进入第二次迭代,但这正是它应该做的事情。如果char *buffer = NULL;
char* readFile(const char *path) {
FILE *file;
file = fopen(path, "r");
if (file == NULL) {
perror(path);
printf("Error: %d \n", errno);
return "Error";
}
//get size of file.
fseek(file, 0, SEEK_END);
size_t fileSize = ftell(file);
//allocate sizeof file +1.
char *buffer = (char *)malloc((fileSize +1) * sizeof(char));
//read file into string
int c;
int i = 0;
while((c = fgetc(file)) != EOF) {
buffer[i] = (char)c;
++i;
}
buffer[i] = '\0';
fclose(file);
return buffer;
}
void freeMem(void) {
free(buffer);
}
int main(void) {
const char *path = "C:\\Programmering\\TestReader\\syntax\\file.txt";
char *cStr = readFile(path);
//freeMem();
system("pause");
return 0;
}
等于catcode==!'Q'&&catcode==!'q'
且等于catcode
,则!'Q'
为真。 !'q'
是一些非零整数(取决于您的系统,但可能是81),'Q'
为零。同样,!'Q'
为零。 !'q'
不为零,因此循环终止。
答案 1 :(得分:1)
您的代码中存在两个问题:
首先,scanf
...
scanf("%s", &catcode);
这不会奏效。 "%s"
说明符期望其对应的参数为char*
到未指定长度的缓冲区(即:这有the same problem as gets()
)。您可能意味着"%c"
,其对应的参数应指向单个字符。现在,建议您的格式说明符不是"%c"
,而是" %c", because that extra space indicates
scanf()to ignore all whitespace it can before
"%c"`。那么,那条线就变成......
scanf(" %c", &catcode);
现在,你是对的,while
循环中存在问题:
while(catcode==!'Q'&&catcode==!'q');
让我们"扩展"这有空白,使你(显然)意图更明显(这是#1在运营商之间使用空间的原因!)......
while(catcode ==! 'Q' && catcode ==! 'q');
对你而言似乎没问题。不适合我。 C语言没有定义任何运算符==!
,而是定义运算符==
(比较相等)和运算符!
(否定其单个操作数)。编译器会将该行理解为......
while(catcode == !'Q' && catcode == !'q');
现在,这是什么意思?如果操作数非零,则!
运算符返回零(在本例中为空字符'\0'
)。否则,它返回一个非负值(通常是1
(标准是否要求这个?))。由于'Q'
不是'\0'
,而'q'
相同,这意味着您的循环有效...
while(catcode == '\0' && catcode == '\0'); // Think of '\0' as 0
代码中表达的绝对无意义!解决方案是简单地使用运算符!=
(比较不等式)......
while(catcode != 'Q' && catcode != 'q');
我希望这能为你带来一些启示!