C中的多行输入-故障排除

C中的多行输入-故障排除,c,string,C,String,我正在尝试读取c中的多行输入。我输入的第一个输入完全可以打印出来,但其余输入缺少第一个字符 因此,我试图打印输入的名称(字符串)是否是有效的标识符名称,并且我希望在一个无休止的循环中获取输入。我知道这里已经贴出了很多类似的问题,但没有一个适合我。我不确定我在这里做错了什么( 我把我所有的代码都放在这里以防万一 #include <stdio.h> #include <string.h> #include <ctype.h> int main() {

我正在尝试读取c中的多行输入。我输入的第一个输入完全可以打印出来,但其余输入缺少第一个字符

因此,我试图打印输入的名称(字符串)是否是有效的标识符名称,并且我希望在一个无休止的循环中获取输入。我知道这里已经贴出了很多类似的问题,但没有一个适合我。我不确定我在这里做错了什么(

我把我所有的代码都放在这里以防万一

#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main() {
        char str[1000];
        int i, dump, check;

        for(;;){
                check = 0;
                scanf("%[^\n]d%*c%*s", str);
                //fgets(str, 1000, stdin);
                printf("str[0]: %c\n", str[0]);
                if ( (str[0] == '_') || ( isalpha(str[0]) ) ){
                        for (i = 1; i < strlen(str); i++) {
                                if (isalpha(str[i]) || isdigit(str[i])) {
                                        continue;
                                } else{
                                        printf("2Invalid\n");
                                        check = 1;
                                }
                        }
                        if (check != 1){
                                printf("String: %s\n", str);
                                printf("Valid\n");
                        }
                } else{
                        printf("Invalid\n");
                        break;
                }

                //Flushing the Buffer    
                while ( (dump = getchar()) == '\n' && dump != EOF);
                //fflush(stdout);
        }
}
#包括
#包括
#包括
int main(){
char-str[1000];
int i,转储,检查;
对于(;;){
检查=0;
scanf(“%[^\n]d%*c%*s”,str);
//fgets(str,1000,stdin);
printf(“str[0]:%c\n”,str[0]);
如果((str[0]='|')|(isalpha(str[0])){
对于(i=1;i
输入: asdasffa 输出: str[0]:a 字符串:asdasffa 有效的

输入: &阿斯达夫 输出: str[0]:a
(当str[0]是“&”,而不是“a”)
字符串:asdaf 有效的

输入: %asdf 输出: str[0]:a
(当str[0]是“%”而不是“a”)
字符串:asdf 有效的

我猜是我刷新缓冲区的方式导致了这个问题

谢谢!

while((dump=getchar())='\n'&&dump!=EOF);
消耗一个字符。尝试在此之后添加对
ungect
的调用,以便扫描函数可以看到它。并删除冗余的
dump!=EOF
。如果dump=
\n
,则它将不会是EOF。

而((dump=getchar())='\n'&&dump!=EOF);

消耗一个字符。请尝试在此之后添加对
ungetc
的调用,以便scanf可以看到它。并删除冗余的
dump!=EOF
。如果dump=
\n
,则它将不会是EOF。

谢谢您的回答。很抱歉,我对C语言不熟悉。您能详细说明一下如何添加对ungetc的调用吗?好的,真的,您应该这样做只需使用fgets而不是scanf,并完全删除这个while循环。如果您想保留它,只需添加
ungetc(dump,stdin)
就在循环之后。这会将一个字符推回到流中,供scanf读取。谢谢你的回答。对不起,我是C语言新手。请你详细说明一下如何添加对ungetc的调用?好的,实际上你应该使用fgets而不是scanf,并完全删除这个while循环。如果你想保留它,只需添加ungect(dump,stdin)就在循环之后。这会将一个字符推回到流上,供scanf读取。
#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main() {
        char str[1000];
        int i, dump, check;

        for(;;){
                check = 0;
                scanf("%[^\n]d%*c%*s", str);
                //fgets(str, 1000, stdin);
                printf("str[0]: %c\n", str[0]);
                if ( (str[0] == '_') || ( isalpha(str[0]) ) ){
                        for (i = 1; i < strlen(str); i++) {
                                if (isalpha(str[i]) || isdigit(str[i])) {
                                        continue;
                                } else{
                                        printf("2Invalid\n");
                                        check = 1;
                                }
                        }
                        if (check != 1){
                                printf("String: %s\n", str);
                                printf("Valid\n");
                        }
                } else{
                        printf("Invalid\n");
                        break;
                }

                //Flushing the Buffer    
                while ( (dump = getchar()) == '\n' && dump != EOF);
                //fflush(stdout);
        }
}