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 正确地修复为所有 0s,这样做:

  char op[size];
  memset(op, 0, size);

另外:precedence() 在不满足任何条件的情况下错过返回任何值。

添加最后的return 语句,例如

int precedence(const char c)

  ...

  return 0;

【讨论】:

谢谢!我更正了优先级()。我还是不明白,是不是某个变量未初始化时总是输出的特殊字符,还是仅用于字符串和字符? @user248884:读取未初始化的变量会引发程序的未定义行为,因此实际上任何事情都可能发生。 Striklty 避免程序的未定义行为

以上是关于C 输出中显示的奇怪符号。有啥线索吗?的主要内容,如果未能解决你的问题,请参考以下文章

c语言中,puts和printf函数有啥区别?

CodeBlocks输出不了中文

无法使用 fstream 从二进制文件中读取字符串,而是显示奇怪的符号

使用json c ++的输出在字段中获取奇怪的字符

动画 UITableView 的自动布局顶部约束导致崩溃,有啥线索吗?

fprintf和printf有啥区别吗?