当我在输入'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;
}
答案 0 :(得分:0)
答案 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.html和longer 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;
}