C语言 读取数字

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言 读取数字相关的知识,希望对你有一定的参考价值。

我现在输入一串字符: (1 2 3)(5 6)
输入的字符都是(数字)(数字)类型的,如何读取括号内数字并存储在一个a[12]中。例子:
输入(1 2 3)(5 6)则赋值: a[1]=2, a[2]=3, a[3]=1, a[5]=6,a[6]=5,即括号内循环,同时在12以内的未赋值数组全部赋值它自己比如,a[4]=4,a[7]=7等.
这个如何用C程序写出?
补充,括号数不一定,同时最大值应该是n由用户输入不超过12

首先建议将数字的分隔符改为",",因为控制台读取是以“空格、制表符、回车”来判断结束的。如果一定要用空格来间隔,就需要固定输入项数,可以将之读到一个数组中来解析,这似乎很不方便。下面这个例子是改用","来分隔输入的数字,括号内向下循环对对应下标的数组项赋值,完全符合你的要求,最大值是设为99,当然你可以方便地改为12,.cpp文件代码如下:
(因是粘贴上的,百度的输入框又小,代码排列可能需要你微调!)
(本例对于输入数字的重复问题未做专门处理,如有必要,你自己尝试一下啦,搞不定再说!)
//====================================================================
// .cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include <windows.h>
#include <iostream>
using namespace std;
//例子用到的变量
bool bCont = true;
int iFlag = 0;
char cInput[1024];
int iMax = 0;
int iTmpArray[100]; //临时数组
int iObiArray[100]; //目的数组
int iIndex = 0; //记录iTmpArray的未赋值项的最小下标
//例子用到的辅助函数
void InitArr(bool bFlag) //数组初始化,参数为1时两个数组都执行,
//0时执行临时数组

if (bFlag)

for (int i = 0; i < 100; i++)

iTmpArray[i] = -1;
iObiArray[i] = -1;


else

for (int i = 0; i < 100; i++)

iTmpArray[i] = -1;



//字串格式判定
bool CheckFormat()

if (cInput[0] == 'Q' || cInput[0] == 'q')

exit(0);

if (cInput[0] == 'H' || cInput[0] == 'h')

cout << "\n【本 例 帮 助】" << endl;
cout << "1、本例最大值(非0)限制在两位数以内!" << endl;
cout << "2、数字串输入格式举例:(12,2,0,8)(3,7)(5,4,9)" << endl;
cout << "3、数字串中数字值不能超过最大值!" << endl;
cInput[0] = NULL;
iFlag = 0;
return FALSE;

int length = (int)strlen(cInput);
if (cInput[0] != 40 || cInput[length - 1] != 41)

printf("\n【错误:输入格式错误!】\n");
return false;

for (int i = 0; i < length; i++)

if (cInput[i] < 48 || cInput[i] > 57)

if (cInput[i] != 44 && cInput[i] != 40 && cInput[i] != 41)

printf("\n【错误:输入了非法字符!】\n");
return false;



return true;


//解析数字串
BOOL Analysis()

int length = (int)strlen(cInput);
for (int i = 0; i < length; i++) //遇到"("或","开始从下一位读数

if (cInput[i] == 44 || cInput[i] == 40)

if (iIndex <= iMax)

int iTmp = atoi(&cInput[i+1]);
if (iTmp > iMax)

printf("\n【错误:输入的数字超过最大值!】\n");
return false;

iTmpArray[iIndex] = iTmp;
iIndex++;

else

printf("\n【错误:数组填充溢出,可能是输入的数字个数超过最大值规定的数组容量!】\n");
return false;


else if (cInput[i] == 41) //读到")"结束本段读数,并进行处理

//括号内循环对目的数组赋值
for (int k = 0; k < iIndex; k++)

iObiArray[iTmpArray[k]] = iTmpArray[k+1];
if (k == iIndex - 1)

if (iTmpArray[k+1] != -1)

printf("\n程序运行错误!\n");
return false;

else

iObiArray[iTmpArray[k]] = iTmpArray[0];



InitArr(0);
iIndex = 0;


return true;


int _tmain(int argc, _TCHAR* argv[])

InitArr(1);
ZeroMemory(cInput,sizeof(cInput));
cInput[0] = NULL; //防止输入0时阻塞
cin.clear();
cin.sync();
while(bCont)

switch (iFlag)

case 0: //输入最大值范围
printf("\n【Q退出 H帮助】请输入菜单码或最大值:");
cin >> cInput;
iFlag = 1;
break;
case 1: //最大值范围校验
if (cInput[0] == 'Q' || cInput[0] == 'q')

exit(0);

if (cInput[0] == 'H' || cInput[0] == 'h')

cout << "\n【本 例 帮 助】" << endl;
cout << "1、本例最大值(非0)限制在两位数以内!" << endl;
cout << "2、数字串输入格式举例:(12,2,0,8)(3,7)(5,4,9)" << endl;
cout << "3、数字串中数字值不能超过最大值!" << endl;
cInput[0] = NULL;
iFlag = 0;
break;

if (cInput[0] < '1' || cInput[0] > '9' || strlen(cInput) > 2)

cin.clear();
cin.sync();
ZeroMemory(cInput,128);
cInput[0] = NULL;
cout << "\n输入格式错误,请重新输入:";
cin >> cInput;
break;

iMax = atoi(cInput);
if (iMax > 99)

cin.clear();
cin.sync();
ZeroMemory(cInput,sizeof(cInput));
cInput[0] = NULL;
cout << "\n最大值超界,请重新输入:";
cin >> cInput;
break;

else iFlag = 2;
break;
case 2: //输入数字串并检查格式
cin.clear();
cin.sync();
ZeroMemory(cInput,sizeof(cInput));
cInput[0] = NULL;
printf("\n【Q退出 H帮助】请在最大值(%d)以内按格式(,,,)\n输入要填充数组的数字:", iMax);
cin >> cInput;
if (CheckFormat()) iFlag = 3;
break;
case 3: //数字串解析并填充数组
if (Analysis())

printf("\n输入内容排列后输出:");
//这里直接变换并输出数值,不再对数组进行完整赋值
for (int i = 0; i <= iMax; i++)

if (iObiArray[i] == -1)

cout << i;

else

cout << iObiArray[i];

if (i < iMax)

cout << " ";

if (i == iMax)

cout << endl;


InitArr(1);
iIndex = 0;
iFlag = 0;

else

iFlag = 2;
InitArr(1);
iIndex = 0;

break;


return 0;
参考技术A 没看懂你的意思,怎样循环?提供断续的代码供你参考:
char a[12];int 1;
printf("\r\n请输入(不回车):");
for(i=0;i<12;i++)

printf("%c",a[i]=getch());
if(a[i]=='('||a[i]==')') a[i]=i;
else a[i]=atoi(a[i]);


补充:
ascI 转化为整数的函数为:atoi();
参考技术B #include <stdio.h>
void main()
char ch,pre='#';
int i=0,num=0,a[12];
for(i=0;i<12;i++)
a[i]=-1;
i=0;
printf("请输入:\n");
while((ch=getchar())!='\n')
if((ch<'0' || ch>'9' )&&(pre>='0' && pre<='9'))
a[i++]=num;
num=0;
else
if(ch>='0' && ch<='9')
num=num*10+ch-'0';

pre=ch;

for(i=0;i<12;i++)
if(a[i]==-1)
a[i]=i;
for(i=0;i<12;i++)
printf("a[%d]=%d\n",i,a[i]);


/*
输入(1 2 3)(7 5)( 4 5 )(11 12)(10)
输出结果

a[0]=1
a[1]=2
a[2]=3
a[3]=7
a[4]=5
a[5]=4
a[6]=5
a[7]=11
a[8]=12
a[9]=10
a[10]=10
a[11]=11
*/

以上是关于C语言 读取数字的主要内容,如果未能解决你的问题,请参考以下文章

C语言怎样将数字从文件里逐个读取出来

C语言字符串读取数字

如下:为啥C语言读取文件中的数据并输出时有乱码出现?本来输入的是数字,然后从文件中读取后就变汉字

c语言读取文件数据乱码

C语言如何读取TXT全部字符?

C语言 读取文件到内存