如何清除空格和回车呢?(在线等)

标哥-iOS攻城狮 2013-06-03 10:09:21
我的代码如下,在主程序下运行到输入操作编号时就不由人输出,而是直接跳过了!
#include <stdio.h>
#include <string.h>

#define MAX_USER_COUNT 10 // 一个至多为10个用户的文件系统
#define MAX_SAVED_FILE_COUNT 10 // 每次用户至多保存10个文件
#define MAX_OPEN_FILE_COUNT 5 // 一次运行用户至多可以打开5个文件

// 文件操作权限枚举
typedef enum
{
CanReadWrite=1, // 可进行读写执行操作
NoReadWrite = 0, // 不可进行读写执行操作
}Access;

//
//UFD用户文件目录
typedef struct
{
char fileName[40]; // 文件名
Access accessType; // 文件保护码
}FileDirectory;

typedef struct
{
FileDirectory file[MAX_SAVED_FILE_COUNT];
int length; // 用户文件目录的长度
}UserFileDirectory;

//
// MFD主目录结构
typedef struct
{
char userName[40]; // 用户名
UserFileDirectory *pUFD;// 指向该用户下的文件目录的首地址
}MainFileDirectory;

// AFD打开文件目录,即运行文件目录
typedef struct
{
char fileName[40]; // 打开的文件名
int type; // 文件的状态,1表示可以用,0表示已经删除
}AccessFileDirectory;

MainFileDirectory MFD[MAX_USER_COUNT];
AccessFileDirectory AFD[MAX_OPEN_FILE_COUNT];
UserFileDirectory UFD[MAX_SAVED_FILE_COUNT];

int afdCount = 0; // 当前已经打开的文件的个数
int mfdCount = 0;
int ufdIndex = 0;

void Init()
{
int i, j;

freopen("test.txt", "r", stdin);

for (i = 0; i < MAX_USER_COUNT; i++)
{
// 读入用户名
scanf("%s", MFD[i].userName);

// 读入该用户名下的文件目录信息
for (j = 0; j < MAX_SAVED_FILE_COUNT; j++)
{
scanf("%s%d", UFD[i].file[j].fileName, &UFD[i].file[j].accessType);
getchar();
}
getchar();
UFD[i].length = MAX_SAVED_FILE_COUNT;

MFD[i].pUFD = &UFD[i];
}
mfdCount = MAX_USER_COUNT;

fclose(stdin);
}

void InitAFD()
{
printf("输入要打开的文件名:\n");
scanf("%s", AFD[afdCount++].fileName);
}

void DisplayUFD(UserFileDirectory *pUFD)
{
int i = 0;

if (pUFD)
{
while (i < pUFD->length)
{
printf("文件名:%s 文件保护码:%d\n", pUFD->file[i].fileName, pUFD->file[i].accessType);
i++;
}
}
}

void Menu()
{
printf("\n*******************文件操作类型************************\n");
printf("* 1、Create文件 *\n");
printf("* 2、Delete文件 *\n");
printf("* 3、Open文件 *\n");
printf("* 4、Close文件 *\n");
printf("* 5、Read文件 *\n");
printf("* 6、Write文件 *\n");
printf("*******************************************************\n");
}

void Read()
{
char fileName[40];
int i;

printf("输入要读操作的文件名:\n");
scanf("%s", fileName);
for (i = 0; i < afdCount; i++)
{
if (strcmp(fileName, AFD[i].fileName) == 0)
{
break;
}
}
if (i >= afdCount || AFD[i].type == 0)
{
printf("文件名不存在或者文件尚未打开!\n");
}
else
{
printf("读操作成功!\n");
}
}

void Write()
{
char fileName[40];
int i;

printf("输入要执行写操作的文件名:\n");
scanf("%s", fileName);
for (i = 0; i < afdCount; i++)
{
if (strcmp(fileName, AFD[i].fileName) == 0)
{
break;
}
}
if (i >= afdCount || AFD[i].type == 0)
{
printf("文件名不存在或者文件尚未打开!\n");
}
else
{
printf("写操作成功!\n");
}
}

void Create()
{
char fileName[40];

printf("输入要创建的文件名:\n");
scanf("%s", fileName);

if (UFD[ufdIndex].length > MAX_SAVED_FILE_COUNT)
{
printf("目录文件已经满,不能再创建!\n");
}
else
{
strcpy(UFD[ufdIndex].file[UFD[ufdIndex].length++].fileName, fileName);
printf("创建成功!\n");
}
}

void Delete()
{
char fileName[40];

printf("输入要删除的文件名:\n");
scanf("%s", fileName);

if (UFD[ufdIndex].length <= 1)
{
UFD[ufdIndex].length = 0;
}
else
{
UFD[ufdIndex].length--;
}
printf("删除成功!\n");
}

void Open()
{
char fileName[40];
int i;

printf("输入要打开的文件名:\n");
scanf("%s", fileName);

i = 0;
while (strcmp(UFD[ufdIndex].file[i].fileName, fileName) != 0 && i < UFD[ufdIndex].length)
{
i++;
}
if (i >= UFD[ufdIndex].length)
{
printf("文件名不存在!\n");
}
else
{
if (UFD[ufdIndex].file[i].accessType == NoReadWrite) // 不可操作
{
printf("文件保护类型为不可读写,不能执行打开文件操作!\n");
}
else
{
printf("打开文件成功!\n");
strcpy(AFD[afdCount].fileName, fileName);
AFD[afdCount].type = 1;
}
}
}

void Close()
{
char fileName[40];
int i;

printf("输入要关闭的文件名:\n");
scanf("%s", fileName);
for (i = 0; i < afdCount; i++)
{
if (strcmp(fileName, AFD[i].fileName) == 0)
{
break;
}
}
if (i >= afdCount || AFD[i].type == 0)
{
printf("文件名不存在!\n");
}
else
{
AFD[i].type = 0;
printf("文件关闭成功!\n");
}
}

int main()
{
char userName[40];
int selection;
int i = 0;
int again;

printf("输入用户名:\n");
scanf("%s", userName);

Init();
fflush(stdin);//没有效果呢?

i = 0;
while (strcmp(MFD[i].userName, userName) != 0 && i < mfdCount)
{
i++;
}
if (i > mfdCount)
{
printf("用户不存在");
return 0;
}

ufdIndex = i;// 记录当前进入系统的用户下标
DisplayUFD(MFD[i].pUFD);
Menu();

do
{
fflush(stdin);
printf("输入操作编号:\n");
scanf("%d", &selection);

switch (selection)
{
case 1:Create();break;
case 2:Delete();break;
case 3:Open();break;
case 4:Close();break;
case 5:Read();break;
case 6:Write();break;
default:
printf("输入的操作编号不正确!\n");
}

printf("again?(1/0)\n");
scanf("%d", &again);
} while (again == 1);

return 0;
}
...全文
145 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2013-06-03
  • 打赏
  • 举报
回复
在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。
anshiny 2013-06-03
  • 打赏
  • 举报
回复
init函数作如下修改,你懂得:
void Init()
{
	int i, j;
	
	freopen("test.txt", "r", stdin);
    
	for (i = 0; i < MAX_USER_COUNT; i++)
	{
		// 读入用户名
		scanf("%s", MFD[i].userName);
				
		// 读入该用户名下的文件目录信息
		for (j = 0; j < MAX_SAVED_FILE_COUNT; j++)
		{
			scanf("%s %d", UFD[i].file[j].fileName, &UFD[i].file[j].accessType);
		}
		UFD[i].length = MAX_SAVED_FILE_COUNT;
		
		MFD[i].pUFD = &UFD[i];
	}
	mfdCount = MAX_USER_COUNT;	
	fclose(stdin);
	freopen( "CON", "r", stdin);
}
PowerBI系列之Power Query专题1.  获取数据 数据源种类介绍和获取Excel数据源输入数据和拷贝数据:创建辅助表解析Json/XML数据格式获取Web网页数据和URL添加动态参数连接数据的四种模式:Import、DirectQuery、Live Connection、Dual双 属于混合模式连接数据库:Sql server、 Mysql(直连但是必须先安装一个mysql插件)DirectQuery直连查询:Sql serverODBC方式获取数据表关联或多个Sql或调用存储过程获取数据SQL中动态传参和自定义函数: sql中使用参数或数据库名称使用参数连接Sharepoint和OneDrive数据源连接Dataset和Dataflow 替换本地数据源为Sharepoint数据源并保留数据处理操作 终止当前数据刷新Loading:Cancel Query数据源设置-重置数据连接凭证PBIDS连接数据源创建和使用报表模块(输入或值列表)利用报表模板和参数控制线下报表数据权限DirectQuery启用自动页面刷新和更改检测管理聚合表提高DirectQuery查询性能动态M查询参数提高DirectQuery查询性能添加数据刷新时间 DateTime.LocalNow()和Getdate()2.  数据清洗和M语言M语言和官方文档介绍PowerQuery中查阅M函数:=#shared, Ctrl+Space提示数据清洗之常用技能:提升标题、更改数据类型、保留删除错误或空行,删除重复项、选择列和删除列、填充单元格、合并列、拆分、提取、替换、条件替换、添加自定义列,添加条件列、添加索引列、分组、添加年月日列、追加和合并查询透视和逆透视以及转置合并单元格的Excel文件处理导入文件夹中多Excel文件并合并解决多文件合并中列顺序不一致使用参数和函数批量导入文件 文本中提取中文、英文、数字等处理双引号转义 列拆分详解解决列名改变错误解决列丢失错误动态显示、排序和重命名列为所有列名添加前缀列名字母大写和分隔符调整Trim标题列中的多余空格如何处理load数据错误为什么load的Excel数据有null空行为什么load的Excel数据标题在第二行灵活添加占位符规范同类相似数据数据按多列排序为分组添加Index序号分组内值合并诊断工具分析数据处理过程PowerQuery小技巧分享 新冠病例活动轨迹地图标识 

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧