[英]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.