#include <stdio.h>
#include<string.h>
#include<stdlib.h>
#define max 100
int a[max];
int top = -1;
char x;
int isempty() ;
int isfull() ;
void push() ;
int pop() ;
void display() ;
void main()
{
int ch;
do
{
printf("\n 1. Push");
printf("\n 2. Pop");
printf("\n 3. Display");
printf("\n 4. Exit");
scanf("%d",&ch);
switch (ch) {
case 1:
push();
break;
case 2:
pop();
break;
case 3:
display();
break;
case 4:
break;
default:
printf("Invalid Choice");
break;
}
}while(ch!=4)
}
int isfull(){
if ( (top == max-1))
{
return 1;
}
else
{
return 0;
}
}
int isempty(){
if((top==-1))
{
return 1;
}
else
{
return 0;
}
}
void push(){
if (isfull())
{
printf("Stack is full");
}
else
{
printf("Enter element to add");
scanf("%s",x);
top++;
strcpy(a[top],x);
}
}
int pop(){
if(isempty())
{
printf("Stack is empty");
exit(0);
}
else{
strcpy(x,a[top]);
printf("%s",x);
top --;
}
}
void display()
{
if(isempty())
{
printf("NO data to display");
exit(0);
}
else
{
int i;
for(i=0;i<top+1;i++)
{
printf("%s \n",a[i]);
}
}
}
在运行推送操作时,它会以非零错误退出而不执行任何操作。
我们必须使用数组和推送和放大器将字母数字值添加到堆栈中。流行。 它应接受一个字符串值,并在选择显示时将其存储在堆栈数组中,它应显示所有值。
有人可以帮我纠正这段代码中的错误,说明为什么它没有为字符串分配或存储任何值。
答案 0 :(得分:2)
这个答案提供了OP在使用上面发布的代码时遇到的所有问题。解决方案的第一部分提供了对这些错误的分析以及如何处理它们。第二部分提供了OP想要实现的解决方案。 (将字符串存储在堆栈中)。
您正在访问未初始化的变量,并将其垃圾值与4
进行比较。我建议do-while
。
do{
printf("\n 1. Push");
printf("\n 2. Pop");
printf("\n 3. Display");
printf("\n 4. Exit");
scanf("%d",&ch);
....
}while(ch!=4);
这个想法很简单。我们正在ch
获得一个输入并完成所有工作。比较是在所有工作结束时完成的。因此,我们始终使用确定的ch
值。
早些时候,您的问题似乎是ch
中的垃圾值不等于4
。这就是它甚至没有进入循环的原因。
您已将程序中的每个变量都设为全局变量。当你得到一个我们必须追踪数据突变的bug时,将会理解调试这个问题的真正痛苦。 不要使用这样的全局变量。
永远不能将字符串存储在int数组中。
scanf("%s",x); This is wrong.
您正在使用%s
说明符输入字符。您应该使用%c
。然后,你不能使用strcpy()
来复制它。
此外,您不需要strcpy()
,您只需使用aissgnment即可。
您可以将char
存储在int
变量和int
数组中。
更正的代码是(push()
函数):
if( scanf(" %c",&x) == 1){
a[++top]=x;
}
在pop()
函数中使用
x = a[top--];
printf("%c",x);
同样在display()
功能中,您需要更改
printf("%c \n",a[i]);
再次,如果您确定只使用字符,为什么不使用char
数组。
这里char a[100]
非常适合。
这些是您的程序生成的错误/警告列表(不使用任何标志)
main.c: In function ‘main’: main.c:48:1: error: expected ‘;’ before ‘}’ token } ^ main.c: In function ‘pop’: main.c:93:12: warning: passing argument 1 of ‘strcpy’ makes pointer from integer without a cast [-Wint-conversion]
strcpy(x,a[top]);
^ In file included from main.c:2:0: /usr/include/string.h:125:14: note: expected ‘char * restrict’ but argument is of type ‘char’ extern char *strcpy (char *__restrict
__dest, const char *__restrict __src)
^~~~~~ main.c:93:14: warning: passing argument 2 of ‘strcpy’ makes pointer from integer without a cast [-Wint-conversion]
strcpy(x,a[top]);
^ In file included from main.c:2:0: /usr/include/string.h:125:14: note: expected ‘const char * restrict’ but argument is of type ‘int’ extern char *strcpy (char *__restrict
__dest, const char *__restrict __src)
^~~~~~ main.c: In function ‘main’: main.c:114:1: error: expected declaration or statement at end of input } ^
使用标志作为alk表示错误和警告将更多。
为了存储字符串,您需要考虑使用2d char数组。这是实现字符串的一种方法。
(仅供参考。仅包含更改。代码具有最小/无错误检查。)
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
#define max 100
char a[max][max];
int top = -1;
char x[max];
int isempty() ;
int isfull() ;
void push() ;
int pop() ;
void display() ;
int main()
{
int ch;
do
{
printf("\n 1. Push");
printf("\n 2. Pop");
printf("\n 3. Display");
printf("\n 4. Exit\n");
scanf("%d",&ch);
switch (ch) {
case 1:
push();
break;
case 2:
pop();
break;
case 3:
display();
break;
case 4:
break;
default:
printf("Invalid Choice");
break;
}
}while(ch!=4);
return 0;
}
int isfull(){
if ( (top == max-1))
{
return 1;
}
else
{
return 0;
}
}
int isempty(){
if((top==-1))
{
return 1;
}
else
{
return 0;
}
}
void push(){
if (isfull())
{
printf("Stack is full");
}
else
{
printf("Enter element to add");
scanf("%s",x);
top++;
strcpy(a[top],x);
}
}
int pop(){
if(isempty())
{
printf("Stack is empty");
exit(0);
}
else{
strcpy(x,a[top]);
printf("%s",x);
top--;
}
}
void display()
{
if(isempty())
{
printf("NO data to display");
exit(0);
}
else
{
int i;
for(i=0;i<top+1;i++)
{
printf("%s \n",a[i]);
}
}
}
在此解决方案中,我们使用了两个主要更改
将char x
转换为char x[max]
,并将a
从int [max]
更改为char a[max][max]
。现在这样做可以存储空终止的char数组。 2d字符数组用于实现此处的堆栈。