C 输出中显示的奇怪符号。有啥线索吗?
Posted
技术标签:
【中文标题】C 输出中显示的奇怪符号。有啥线索吗?【英文标题】:Strange Symbol shown in C output. Any clues?C 输出中显示的奇怪符号。有什么线索吗? 【发布时间】:2014-02-24 19:35:19 【问题描述】:我正在尝试编写从中缀转换为前缀的代码。这里是:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int top = -1, size;
int precedence(char c)
if (c=='+' || c=='-')
return 1;
if (c=='*' || c=='/')
return 2;
if (c=='^')
return 3;
/* push the given data into the stack */
void push(char *stack, char data)
top++;
//printf("Top:%d, Size:%d\n",top,size);
if (top >= size )
printf("Stack Overflow\n");
return;
//printf("Hello in PUSH\n");
stack[top] = data;
return;
/* pop the top element from the stack */
void pop(char *stack)
if (top <= -1)
printf("Stack Underflow!\n");
return;
stack[top] = '*';
top--;
return;
char peek(char *stack)
return stack[top];
void stackp(char *stack)
int r;
printf("Print Stack:\n");
for(r=0;r<top;r++)
printf("%c\n",stack[r]);
int main()
char data;
char ip[100];
int i,j;
printf("Enter the Input, Input can be of max 100 characters:\n");
scanf("%s", ip);
size=strlen(ip);
char op[size];
char stack[size];
for(i=size-1;i>-1;i--)
stackp(stack);// Print Stack
//printf("Hello\n");
//printf("%c ",ip[i]);// Print current element
if((ip[i]-'0')>0 && (ip[i]-'0')<9)
// printf("Hello\n");
strcat(op,&ip[i]);
printf("%s \n",op);
break;
else if(top==-1)
push(stack,ip[i]);
break;
else if(top!=-1 && ip[i]==')')// Brackets Condition
while(stack[top]!='(')
strcat(op,&ip[i]);
pop(stack);
else if(top!=-1 && (precedence(stack[top])-precedence(ip[i])>0) )
while(precedence(stack[top])-precedence(ip[i])>0 || top!=-1 )
strcat(op,&ip[i]);
pop(stack);
push(stack,ip[i]);
else
push(stack,ip[i]);
//printf("%s ",op);
在我编译和运行时。我在输出中得到了一个非常 strange looking symbol。
谁能告诉我这是什么鬼?如何纠正?
【问题讨论】:
它是一个不可打印的字符,可能在 ascii 0 到 40 之间 看起来像 FireFox 用来显示不可打印字符 U+0001 的东西。通过不输出值为1
的字节来纠正它。找出你的哪个输出语句发出它,然后找出为什么正在打印的 var 不包含你期望它包含的内容
tesseract 的意思是 40 八进制,也就是 20 十六进制,他的字面意思是“介于”,因为 40 八进制是一个空格。
我实际上没有时间看这个,但快速猜测是stack[r] == 1
应该是stack[r] == '1'
,或者printf("%c\n",stack[r]);
应该是printf("%d\n", (int)(stack[r]));
注意:您不应该使用strcat
添加一个字符。使用op[j++] = ip[i];
,最后使用op[j] = '\0';
【参考方案1】:
代码附加到一个未初始化的变量,并在此处引发未定义的行为:
char op[size];
...
strcat(op, ...);
要将此初始化 op
正确地修复为所有 0
s,这样做:
char op[size];
memset(op, 0, size);
另外:precedence()
在不满足任何条件的情况下错过返回任何值。
添加最后的return
语句,例如
int precedence(const char c)
...
return 0;
【讨论】:
谢谢!我更正了优先级()。我还是不明白,是不是某个变量未初始化时总是输出的特殊字符,还是仅用于字符串和字符? @user248884:读取未初始化的变量会引发程序的未定义行为,因此实际上任何事情都可能发生。 Striklty 避免程序的未定义行为。以上是关于C 输出中显示的奇怪符号。有啥线索吗?的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 fstream 从二进制文件中读取字符串,而是显示奇怪的符号