繁体   English   中英

C 程序中 printf 的行为非常奇怪

[英]Very strange behavior with printf in C program

我目前正在学习免费 edX.org C 编程课程的课程。 我正在研究链表上的最终示例并使用下面的代码。 这段代码还没有完成,但让我感到困惑的是,当取消注释 main 中的注释行时,没有 printf 语句将 output 提供给控制台。 甚至是该行之前的 printfs。

当我运行它时,我只需输入 123 然后按回车键。只要注释掉该行,printfs output 就可以了。 我还应该提到,在 printfs 被注释掉的情况下设置断点时,程序似乎继续执行并超过断点,但控制台上没有出现 output。

任何人都可以深入了解为什么会这样吗? 我正在使用 GCC 工具链在 Fedora Linux 上的 STM32CubeIDE 中运行它。 如果我能提供更多细节,请告诉我。 谢谢。

#include <stdio.h>
#include <stdlib.h>

struct digit {
    int num;
    struct digit *next;
};

struct digit * createDigit(int);
struct digit * append(struct digit * end, struct digit * newDigptr);
void printNumber(struct digit *);
void freeNumber(struct digit *start);
struct digit * readNumber();
struct digit * searchNumber(struct digit * start, int number);
struct digit* reverseNumber(struct digit* start);

int main(void) {
    struct digit *start, *backwards;
    printf("Please enter a number: ");
    start = readNumber();
    printf("a\n");
    printNumber(start);
    printf("b\n");
    //backwards = reverseNumber(start);
    printf("c\n");
    freeNumber(start);
    return 0;
}

struct digit *createDigit(int dig) {
    struct digit *ptr;
    ptr = (struct digit *) malloc(sizeof(struct digit));
    ptr->num = dig;
    ptr->next = NULL;
    return ptr;
}

struct digit * append(struct digit * end, struct digit * newDigptr) {
    end->next = newDigptr;
    return(end->next);
}

void printNumber(struct digit *start) {
    struct digit * ptr = start;

    while (ptr!=NULL) {
        printf("%d", ptr->num);
        ptr = ptr->next;
    }
    printf("\n");
}

void freeNumber(struct digit *start) {
    struct digit * ptr = start;
    struct digit * tmp;
    while (ptr!=NULL) {
        tmp = ptr->next;
        free(ptr);
        ptr = tmp;
    }
}

struct digit * readNumber() {
    char c;
    int d;
    struct digit *start, *end, *newptr;
    start = NULL;
    scanf("%c", &c);
    while (c!='\n') {
        d = c - 48;
        newptr = createDigit(d);
        if (start==NULL) {
            start = newptr;
            end = start;
        } else {
            end = append(end, newptr);
        }
        scanf("%c", &c);
    }
    return start;
}


struct digit * searchNumber(struct digit * start, int number) {
    struct digit * ptr = start;
    while ((ptr!=NULL) && (ptr->num!=number)) {
        ptr = ptr->next;
    }
    return(ptr);
}

    struct digit* reverseNumber(struct digit* start)
    {
        // iterate the original list and for each element make it the end in the new list
        struct digit *next, *newListStart;
        newListStart = next = start;
        if(newListStart == NULL)
                    printf("yay");
                else
                    printf("nay");
        while(next != NULL)
        {
            next = next->next;
            newListStart->next = createDigit(newListStart->num);
            newListStart = createDigit(next->num);
        }

        return newListStart;
    }

你的问题在于你的reverseNumber

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM