让我们假设有人在写一些文字。我的程序必须扫描该文本,然后在彼此之间打印所有字符。但是,它仅应读取输入,直到*出现。因此,当输入为“ Hello * darling”时,应仅读取“ Hello”。我在while循环中使用*作为参数,但是我的程序扫描的是“ Hello *”而不是“ Hello”。我如何摆脱*?
#include <stdio.h>
int main()
{
char c1;
while (c1!='*'){
scanf("%c", &c1);
printf("c1: %c \n", c1);
}
return 0;
}
答案 0 :(得分:4)
您应该查看getchar()
#include <stdio.h>
int main()
{
int c1;
while ((c1=getchar())!=EOF && c1!='*'){
printf("c1: %c \n", c1);
}
return 0;
}
编辑:这样,就不会有未定义的行为,因为c1
总是被初始化的(请参阅@Blaze答案):)
答案 1 :(得分:3)
您可以切换scanf
和printf
语句,并在循环前放置一个初始scanf
:
int main()
{
char c1 = '\0';
do {
printf("c1: %c \n", c1);
if (scanf(" %c", &c1) != 1)
return -1;
} while (c1 != '*');
return 0;
}
还请注意,与您的程序当前一样,打印*
不仅存在问题,而且是未定义的行为,因为c1
在c1 != '*'
的第一次运行中未初始化。 / p>
答案 2 :(得分:1)
使用scanf()
和进行完整的错误检查和记录:
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
int main(void)
{
int result = EXIT_SUCCESS; /* Be optimistic. */
{
int r;
{
char c1 = 0;
while (EOF != (r = fscanf(stdin, " %c", &c1)) && c1 != '*')
{
if (1 != r)
{
fputs("Invalid input. Retrying ...", stderr);
}
else
{
printf("c1: %c \n", c1);
}
}
}
{
int errno_save = errno;
if ((EOF == r) && ferror(stdin))
{
errno = errno_save;
perror("scanf() failed");
result = EXIT_FAILURE;
}
}
}
return result;
}
答案 3 :(得分:0)
在要在循环开始时检查条件的时候或在要检查条件时使用,请执行...直到您想在结束时检查。如果要在中间进行检查,我更喜欢无限循环(“ while(TRUE)”或“ for(;;)”),并在中间使用if / break。以您的循环,将是:
while (TRUE){
scanf("%c", &c1);
if (c1=='*') {
break;
}
printf("c1: %c \n", c1);
}
有些人不喜欢,替代方法是使用return而不是break来使该函数成为函数:
boolean get_and_print_if_not_end() {
scanf("%c", &c1);
if (c1=='*') {
return true;
}
printf("c1: %c \n", c1);
return false;
}
您可以在一个基本的while循环中调用它:
while (!get_and_print_if_not_end()) {
// Nothing to do here.
}
答案 4 :(得分:0)
#include<stdio.h>
#include<ctype.h>
int main()
{
char string;
do
{
printf("String is :%c\n",string);
if(scanf("%c",&string)!=1)
{
return 0;
}
}while(string!='*');
return 0
}
这里:
首先,它将获取字符串字符并将其与*字符进行比较(如果找不到该字符),它将打印该字符。否则发现它将返回0,并且程序将被清除。