- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试打印一个链表,它的行为很奇怪,当它应该移动到下一个项目时它不会,例如打印的第一个项目是“Granny Smith”,然后是结构中的其余部分,当它转到下一行时,应该是一种新食物的是“ranny Smith”总是没有 G,并且大多数其他细节都已损坏或乱码。任何帮助将不胜感激。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define cls system("cls");
#define flush fflush(stdin)
#define pause system("pause");
struct food // Declaration of struct
{
char produce[20];
char type[20];
char soldBy[20];
float price;
int quantityInStock;
struct food *next;
};
void addPres(struct food** tip, char tokenPro[20], char tokenType[20], char tokenSold[20], float tokenFloat, int tokenInt);
void display ();
void displayMenu ();
int getChoice ();
void readDataIn();
int main()
{
int choice = 0;
int ;
struct food first;
char *saveFloat, *saveInt;
char tokenPro[20], tokenType[20], tokenSold[20], savePro[20], saveType[20], saveSold[20], j[1900];
float tokenFloat, messFloat;
int danint, tokenInt;
struct food* a = NULL;
FILE* file;
a = NULL; // sets the first item on the list to empty
//readDataIn();
do
{
choice = getChoice();//function to present choices and receive an answer
switch (choice)//switch routes the choice
{
case 1: //to enter a new node on the list
cls;
printf("Enter the produce type: ");
fgets(tokenPro, 20, stdin);
printf("Enter the type: ");
fgets(tokenType, 20, stdin);
printf("Enter the units of measurement: ");
fgets(tokenSold, 20, stdin);
printf("\nEnter the price per %s: ", &tokenSold);
scanf("%f", &tokenFloat );
printf("\nEnter the quantity in stock: ");
scanf("%i", &tokenInt );
//pause;
addPres(&a, tokenPro, tokenType, tokenSold, tokenFloat, tokenInt);
break;
case 2: //to display the linked list
display(a);
break;
case 3: //to reverse the order
if((file=fopen("AssignmentTwoInput.txt", "r")) != NULL) //opens files
{
while(fgets(j, sizeof(j), file)) //while information is being sent to j from the file
{
strcpy(savePro, strtok(j, ","));
strcpy(saveType, strtok(NULL, ","));
strcpy(saveSold, strtok(NULL, ","));
saveFloat = strtok(NULL, ",");
saveInt = strtok(NULL, "\n");
messFloat = atof(saveFloat); //ID number is assigned to token2
danint = atoi(saveInt); //converts the value token2 points to into an int (previously read in as an string)
addPres(&a, savePro, saveType, saveSold, messFloat, danint); //sends the name and ID to the function to add a person
//printf("\n %s \t %s \t %s \t %f \t %i", savePro, saveType, saveSold, messFloat, danint);
//pause;
}//end while loop
}//end if loop
printf("\nSuccessfully loaded input file\n\n\n"); //message to tell user the back was found and imported successfully
pause;
fclose(file);
break;
case 4: //to export data
break;
case 5: //option to exit
exit(0);
break;
default://error checking
printf("Please enter a valid choice.\n");
break;
}//switch loop close
}
while (choice != 5); //end menu choices
return 0;
}//end main
void addPres(struct food** tip, char tokenPro[20], char tokenType[20], char tokenSold[20], float tokenFloat, int tokenInt)
{
struct food* temp =
(struct food*) malloc(sizeof(struct food));
strcpy(temp->produce, tokenPro);
strcpy(temp->type, tokenType);
strcpy(temp->soldBy, tokenSold);
temp->price = tokenFloat;
temp->quantityInStock = tokenInt;
//printf("\n %s \t %s \t %s \t %f \t %i", temp->produce, temp->type, temp->soldBy, temp->price, temp->quantityInStock);
//pause;
if (tip == NULL) //if the tip node is empty
{
tip = temp; //tip node becomes this node
(*tip)->next = NULL; // since there are no others yet the next node will be empty
}
else
{
temp->next = tip; // reassigns the tip node to the next one
(*tip) = temp; //inserts current node as the tip
}
}
void display(struct food* c)
{
//c = first; //assigns c to the first node on the linked list
int count = 1;
struct food *temp;
temp = c;
cls;
printf("==========================================================================\n"); //prints a header to say which info is which
printf(" Item # Produce Type Sold By Price In Stock\n");
printf("==========================================================================\n");
while( c != NULL)
{
printf("%3i \t", count);
printf("%s \t", c->produce ); //prints name
printf("%s \t", c->type ); //prints name
printf("%s \t", c->soldBy); //prints name
printf("%-3.2f \t", c->price); //prints ID
printf("%i\n", c->quantityInStock); //prints ID
pause;
count = count + 1;
c = c->next; //advances to next item in the linked list
if(c == NULL)
{
printf("\n end \n"); //once end is found user is told
pause;
}
}
printf("\n done \n");
pause;
}//end display
最佳答案
你犯了三个重要的错误,其中一个好像是复制粘贴了一些代码导致的,
这个printf()
语句会导致未定义的行为
printf("\nEnter the price per %s: ", &tokenSold);
因为您传递的是正确的地址,但指针类型是错误的,所以指针运算将导致 printf()
内部发生未定义的行为
printf("\nEnter the price per %s: ", tokenSold);
/* remove the & --------------------^ here */
您向 addPres
传递了一个双指针,但您从未取消对它的引用以访问实际的指针,这就是您要修改的内容,它会导致未定义的行为和观察到的效果一个空列表,因为一旦函数返回它并没有改变原来的指针,你应该在这个函数中使用解引用运算符访问双指针,例如而不是
if (tip == NULL)
必须是
if (*tip == NULL)
这同样适用于此函数内的每次访问。
我怎么这么快就发现了所有这些问题?
Because I compiled your programs with compiler warnings enabled and it started showing those problems.
您的代码中还会有其他问题吗?
Yes probably, but you need to fix these first.
你 fflush(stdin)
,一个很常见的错误,似乎来自一些教程或书籍或在线资源,标准明确指出 fflush()
用于输出流,输入流的行为未定义,以下摘自C11草案
7.21.5.2 The fflush function
- If stream points to an output stream or an update stream in which the most recent operation was not input, the
fflush
function causes any unwritten data for that stream to be delivered to the host environment to be written to the file; otherwise, the behavior is undefined.
关于C编程打印链表,不沿列表移动并崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28790819/
有没有更好的方法用 PHP 将数据输出到 html 页面? 如果我想在 php 中用一些 var 制作一个 div,我会写类似的东西 print (''.$var.''); 或 echo "''.$v
我可以使用 java awt print 来打印文档/文件而不是使用 javax print 吗?我发现在 java awt print 中有一个选项可以使用 AttributedString 将内容
目前我通过以下方式运行 R 脚本: R --slave argument1 argument2 ... 我想知道 R 中关于如何退出脚本并发出警告的最佳实践,q() 会这样做吗? if(!file.
谁能告诉我如何编写一个程序,用 gcc 编译时打印 c ,用 g++ 编译时打印 c++? 最佳答案 #ifdef __cplusplus printf("c++\n"); #else
我需要支持在 KitKat 设备上打印,但我的目标 SDK 是 13(无法更改)。 特别是我需要打印一个 webview。 这是用于打印 webview 的 API: http://developer
我正在尝试创建一个简单的函数,其中 python 将根据您的年份输入计算年龄。我已经尝试了几种方法,但我没有运气 atm。 附:对不起,我是新手。 ame = input(" Enter your n
JavaFX 2.0 是否支持打印?我有一个文本区域,我从中获取文本然后我想打印它,但似乎没有这个功能。 当然,这里我说的是打印到打印机。 :) 最佳答案 尚不支持。作为一种解决方法,您可以使用 Ja
我试图找出printOn的重点。我查看了一些实现它的类,看起来它只是帮助打印不同数据类型的单位。这是准确的吗? 如果是这样,有人能指出我如何为我自己的类(class)实现这一点的正确方向吗?我将在可能
我无法让 IE 打印我的 Canvas (使用 excanvas 生成)...我使用的是最新版本的 excanvas。 http://dl.dropbox.com/u/997831/canvas.ht
我搜索了很多但没有人回答我的问题,我读到在这样的信号处理程序中使用 cout 是不安全的: void ctrlZHandler(int sig_num) { //SIGTSTP-18
我有兴趣打印一系列查询。我有以下代码。 start = datetime.datetime(2012, 2, 2, 6, 35, 6, 764) end = datetime.datetime(201
public class javaClass { public static void main(String [] arg) { String row1 = "A____A"
我需要写入前一行的命令,例如不带\n 的 print()。 下面是一些示例代码: a=0 print("Random string value") if a==0: print_to_prev
我有一个使用 UIKit 和 Objective C 的旧 iOS 应用程序,我目前正在将其移植到 SwiftUI 和 Swift。一切都很顺利,我喜欢 Swift 和 SwiftUI。该应用程序已经
我创建了一个求和函数,它接受一个开始编号和一个结束编号,并返回这两点之间的总和答案 def print_sum_equations(start_number,end_number):
在 Perl 6 中,print 和有什么区别? , put和 say ? 我怎么看 print 5不同,但 put 5和 say 5看起来一样。 最佳答案 put $a就像 print $a.Str
我正在使用 here 中的 getOrgChart 库,我正在尝试打印整个图表,而不仅仅是可见部分。不幸的是,当使用标准库打印功能时,它只会打印出第一部分,而我不知道如何打印整个图表(该图表相当宽,大
我制作了一个非常适合 A4 页面的 View 。现在我想打印它。请注意,我没有使用drawRect或类似的东西,只是一个带有 subview 和文本标签的普通 View 。我的问题是,我对该 View
由于 Cocoa-Java 已弃用,我正在将 Cocoa-Java 代码迁移到 Cocoa + JNI。该代码打印存储在文件中的图像。新的 Cocoa 代码基本上是: NSImage *image =
这个问题已经有答案了: Printing a TDBGrid (4 个回答) 已关闭 6 年前。 如何在不安装或下载组件的情况下打印 DBGrid? 或者 如何将 DBGrid 的数据放入 RichE
我是一名优秀的程序员,十分优秀!