我的scanf函数在if函数内部不起作用

时间:2017-05-03 06:04:49

标签: c

当我在输入'a'或'b'后尝试在if函数内运行scanf时,它立即运行并退出程序而不输入。有没有办法解决它,所以scanf在if和else if函数内部工作?

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

int top=-1;
int word;


char stack_string[100];
void push(char word);
char pop(void);
int main()
{
    char input;
    char str[100];
    int i;
    printf("press [a] for palindrome check, [b] for string reversal:");
    scanf("%c", &input);

    if (input == 'b'){
        printf("Input a string: ");
        scanf("%[^\n]s", str);
        for(i=0;i<strlen(str);i++)
            push(str[i]);
        for(i=0;i<strlen(str);i++)
            str[i]=pop();
        printf("Reversed String is: %s\n",str);
    }
    else if(input == 'a'){
        char str[100];
        int count = 0;
        printf("Input a string: ");
        scanf("%[^\n]s", str);

        for (i = 0; i < strlen(str); i++)
        {
            push(str[i]);
        }

        for (i = 0; i < strlen(str); i++)
        {
            if (str[i]==pop())
            count++;
        }

        if (count == strlen(str))
            printf("%s is a palindrome\n", str);
        else
            printf("%s is not a palindrome\n", str);

    }

    return 0;
}

void push(char word)
{
    top=top+1;
    stack_string[top]=word;
}

 char pop()
{
    word = stack_string[top];
    top=top-1;
    return word;
}

3 个答案:

答案 0 :(得分:0)

使用此:

scanf(" %[^\n]s", str);
      ^^^
    Whitespace

而不是

scanf("%[^\n]s", str);

有关详细信息,请参阅this链接。

答案 1 :(得分:0)

停止使用scanf()。终端一次向您的应用程序发送一个完整的行,但是scanf()仅消耗它所需的部分,例如%c的一个字符或%d的所有数字。 。其余的留在输入缓冲区中,以下scanf()获取它们。这导致用户的输入和程序收到的内容有点“不同步”。

最好一次读取完整行,fgets()getline(),然后解析他们想要的任何内容。 E.g:

#define LINELEN 255 
char line[LINELEN];
fgets(line, LINELEN, stdin);
int num;
int a = sscanf(line, "%d", &num);

sscanf()上使用您需要的任何格式字符串,并根据需要将整个内容放在函数中。 (LINELEN当然是任意的 限制,但fgets()需要一些限制。)

另请参阅:http://c-faq.com/stdio/scanfprobs.htmllonger explanation在那里相关联。

答案 2 :(得分:0)

像这样使用scanf:scanf("%s", str)

只需要更改scanf语句:

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

int top=-1;
int word;


char stack_string[100];
void push(char word);
char pop(void);
int main()
{
char input;
char str[100];
int i;
printf("press [a] for palindrome check, [b] for string reversal:");
scanf("%c", &input);

if (input == 'b'){
    printf("Input a string:\n");
    scanf("%s", str);
    for(i=0;i<strlen(str);i++)
        push(str[i]);
    for(i=0;i<strlen(str);i++)
        str[i]=pop();
    printf("Reversed String is: %s\n",str);
}
else if(input == 'a'){
    char str[100];
    int count = 0;
    printf("Input a string:\n");
    scanf("%s", str);

    for (i = 0; i < strlen(str); i++)
    {
        push(str[i]);
    }
 for (i = 0; i < strlen(str); i++)
    {
        if (str[i]==pop())
        count++;
    }

    if (count == strlen(str))
        printf("%s is a palindrome\n", str);
    else
        printf("%s is not a palindrome\n", str);

}

    return 0;
}

void push(char word)
{
    top=top+1;
    stack_string[top]=word;
}

 char pop()
{
    word = stack_string[top];
    top=top-1;
    return word;
}