- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个用 C 语言编写的简单电话簿,可以将输入信息保存到我电脑上的一个文本文件中。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <stdbool.h>
void validateName(char name[], FILE *fptr);
void validateID(char id[], FILE *fptr);
void validateScore(int score, FILE *fptr);
void addContact(char name[], char id[], int score, FILE *fptr);
void printContact(FILE *fptr);
void printAll();
int main()
{
char name[30], id[10];
int score;
int i;
FILE *fptr;
fptr = fopen("C:\\c\\program.txt","w");
if(fptr == NULL)
{
printf("Error!");
exit(1);
}
else {
bool flag = true;
do{
printf("\n1. Press 1 to display record\n"
"2. Press 0 to add a new contact\n"
"3. Press -1 to display all records\n\n");
int option;
scanf("%d", &option);
switch(option) {
case 1:
printContact(fptr);
flag = false;
break;
case 0:
addContact(name, id, score, fptr);
flag = false;
break;
case -1:
printAll();
flag = false;
break;
default:
printf("wrong choice, try again\n\n");
}
} while(flag);
fclose(fptr);
return(0);
}
}
void validateName(char name[], FILE *fptr){
bool flag = true;
while(flag){
fgets(name, 30, stdin);
if ((strlen(name) < 3) || (strlen(name) > 20)) {
printf("error\nplease enter name again: ");
} else {
flag = false;
}
}
}
void validateID(char id[], FILE *fptr){
bool flag = true;
while(flag) {
if (!isalpha(id[0])){
printf("enter a letter as first char\n");
}
else if(strlen(id) > 10) {
printf("error too much numbers \n");
} else {
flag = false;
}
}
}
void validateScore(int score, FILE *fptr) {
if(score >= 0 && score <= 100) {
fprintf(fptr, "SCORE: %d\n", score);
} else {
printf("invalid input");
(exit(1));
}
}
void addContact(char name[], char id[], int score, FILE *fptr) {
//first name
printf("Enter name: ");
scanf("%s", name);
validateName(name, fptr);
fprintf(fptr,"NAME: %s \n", name);
//id
printf("Enter id: ");
scanf("%s", id);
validateID(id, fptr);
fprintf(fptr,"STUDENT NO: %s\n", id);
//score
printf("enter score: ");
scanf("%d", &score);
validateScore(score, fptr);
}
void printContact(FILE *fptr) {
int c;
char contacts[50];
while((c = getchar()) != EOF) {
fscanf(fptr, "%s", &contacts);
for(int i = 50; i < 50; i++){
printf("%s", &contacts);
}
}
}
void printAll() {
}
我的第一个问题是在 validateID 函数中:当我尝试验证第一个条件时,我不断陷入无限循环,即确保第一个索引是一个字符。
我的第二个问题是,当我输入姓名、学号和分数时,程序结束了,我没有返回到菜单切换语句来选择其他选项?
我做错了什么或者我错过了什么?
最佳答案
在我看来,拥有像 void validateXXX
这样的函数的想法是错误的。将其与类似于验证的 isalpha
进行比较。 isalpha
返回一个 int
以便您可以使用它进行检查。您的验证函数可能应该做同样的事情。所以不是:
void validateID(char id[], FILE *fptr){
bool flag = true;
while(flag) {
if (!isalpha(id[0])){
printf("enter a letter as first char\n");
}
else if(strlen(id) > 10) {
printf("error too much numbers \n");
} else {
flag = false;
}
}
}
函数可以是:
int validateID(char id[]){
if (!isalpha(id[0])){
printf("enter a letter as first char\n");
return 0;
}
if(strlen(id) > 10) {
printf("error too much numbers \n");
return 0;
}
return 1;
}
然后你可以像这样使用它:
do {
scanf("%s", id); // See below !!!!
} while(!validateID(id));
以便您继续阅读,直到输入有效 ID。
下一步:
从不使用scanf("%s", ...)
- 从不
没有检查输入的长度,因此用户可以输入一些太长而无法存储在您提供的缓冲区中的文本(例如 id
)。这对您的程序来说将是灾难性的,因为它会写入数组边界之外。您的程序可能会崩溃或做各种奇怪的事情。
您应该使用fgets
来读取用户输入。它更容易也更安全。
对于你的主循环:
是的,当您在 switch
中的所有 case
中将 flag
设置为 false 时,它当然会终止。
关于C电话本程序: how to exit avoid infinite loop and how to return to the switch statement menu,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42290780/
解释 onCreateOptionsMenu(Menu menu) 和 onPrepareOptionsMenu(Menu menu) 的区别。 最佳答案 onCreateOptionsMenu()
所以我又一次为一些问题而苦苦挣扎。这次是这样的,当我将鼠标悬停在 portfoilio 的下拉菜单上时(当网站处于移动 View 模式时),它只会越过其他元素,我尝试使所有内容相对,删除 float
我正在为移动设备设置新菜单。一切都设置好了,但在我点击任何菜单项后,它并没有关闭菜单和菜单覆盖。 有什么办法解决这个问题吗? 我在下面提供了我的 CSS 和 HTML 代码。 CSS margin
我正在使用 selenium webdriver 为单页 Web 应用程序开发一个 Java 框架,使用以下模式:PageObject、SlowLoadableComponent(责任链)、PageF
我是一个动态创建和选项菜单,选项菜单取决于 onCreate() 阶段创建的数据。 问题在于 onCreateOptionsMenu() 在创建数据之前被调用。有没有办法在onCreate()之后执行
HTML: Portfolio Services About Testimonials Request a Quote CSS: ul#menu li {
我是 extjs 的新手。我想在从 Ext.menu.Menu 选择菜单项时关联一个商店。我正在使用 extjs 4.1.0。我在网上搜索甚至通过 sencha doc 但我找不到任何方法来实现这一目
我正在使用 Bootstrap 3.0.0 制作网站 除了下拉菜单不起作用之外,一切都很好。 在文件的头部,我做出了以下声明: 有什么东西不见了? html 应该是正确的:
我刚刚开始学习 JQuery/JavaScript,我无法弄清楚使用 (".menu") 和 ("menu") 之间的区别以及应该在哪里使用它们? 最佳答案 它是menue,jquery使用css选择
我正在尝试向我的应用程序页面之一添加菜单,但由于某种原因,它没有出现。我使这个特定页面扩展了 AppCompactActivity 并覆盖了 onCreateOptionsMenu(Menu menu
我需要完全控制透视菜单。 我已经侵入平台以禁用上下文菜单: private void disablePerspectiveToolbarMenu() { PerspectiveBarManag
假设我有一个包含一些项目的菜单 (Ext.menu.Menu)。显示菜单时,用户 cat 右键单击它的项目,将显示浏览器上下文菜单(带有“将链接另存为...”等元素)。 如何禁用该浏览器上下文菜单
我有一个按钮,单击后将展开一个菜单项,我希望能够通过 java 脚本控制台以编程方式单击其中一个菜单项。这是我单击按钮所需的内容,但在单击 Ext.menu.Menu 时需要一些帮助 var fire
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提出有关书籍、工具、软件库等建议的问题。您可以编辑问题,以便可以用事实和引用来回答它。 5年前关
在这里,我正在从事 safari 扩展开发。我已经在 safari 浏览器上成功获得了开发者证书。 在这里,我可以在工具栏项上创建菜单和子菜单,但根据我的项目要求,我必须在栏中包含菜单和菜单项。 请建
我正在使用 Java 和 Android Studio。我需要更改操作栏上的图像。我需要做的是根据从远程传感器接收到的读数来更改在操作栏上显示的图像。因此,我无法使用可点击的方法,而是使用一些代码在从
亲爱的..我有一个问题。在 Firebug 展上: $("#menu ul.menu").lavaLamp 不是 menu.js 中的函数 悬停在菜单上不显示。我把这个问题显示出来:
因此,我接到了一项任务,即使用 CSS 为网页创建一个汉堡包式多级菜单。这里的问题是添加一个子菜单,使其成为一个多层次的汉堡包。下面是我到目前为止为汉堡包多级菜单编写的代码片段 body { marg
我正在学习 Android 并遵循简单的相机应用教程。我复制了一段代码,但出现错误,我不确定原因。 我使用的教程是, http://iwearshorts.com/blog/android-devel
我的/About 中有一个包含路线的子菜单。 这个子菜单称为 AboutMenu 并出现在/About 下的所有页面,例如 =>/About/Company 和/About/Info。 练习示例显示
我是一名优秀的程序员,十分优秀!