user-0 提问: 向大神请教一个读取数字字母串的程序，不知道错在哪里，谢谢了

回复:
user: user-1
content: 仅供参考：#include <stdio.h> char s[]="123 ab 4"; char *p; int v,n,k; void main() {     p=s;     while (1) {         k=sscanf(p,"%d%n",&v,&n);         printf("k,v,n=%d,%d,%d\n",k,v,n);         if (1==k) {             p+=n;         } else if (0==k) {             printf("skip char[%c]\n",p[0]);             p++;         } else {//EOF==k             break;         }     }     printf("End.\n"); } //k,v,n=1,123,3 //k,v,n=0,123,3 //skip char[ ] //k,v,n=0,123,3 //skip char[a] //k,v,n=0,123,3 //skip char[b] //k,v,n=1,4,2 //k,v,n=-1,4,2 //End.

user: user-2
content: 1.txt是这样的：只有两行 +123 00 ab -123 -- abc ++ +abc -abc

user: user-2
content: 大道至简 仅供参考：  #include <stdio.h> #include <stdlib.h> #include <ctype.h> #define LINE 80 int n1, n2; char str[10][20]; int num[10]; void evaluate(char *line, int n) { 	char buf[80]; 	int i = 0, j = 0, flag; 	while (1) 	{ 		j = 0; 		//跳过空白字符 		while (line[i] && (line[i] == '\t' || line[i] == ' ')) i++; 		if (line[i] == 0) break; 		while (line[i] && line[i] != '\t' && line[i] != ' ') 		{ 			if (line[i] == '+' || line[i] == '-') 			{ 				if (isdigit(line[i + 1]))  //下一个字符是数字，处理形如 "+123"  "-123" 的数字 					flag = 1; 				else 					flag = 0; 			} 			else if (isdigit(line[i])) 				flag = 1; 			else 				flag = 0;  			while (line[i] && line[i] != '\t' && line[i] != ' ') 			{ 				buf[j++] = line[i++]; 			} 			buf[j] = 0;  			if (flag)   //处理数字 			{ 				sscanf(buf, "%d", num + n1); 				n1++; 			} 			else   //处理字符串 			{ 				sscanf(buf, "%s", str + n2); 				n2++; 			} 		} 	} } int main()  //118 { 	FILE *fp; 	char line[LINE], inFile[20]; 	printf("请输入文件名: "); 	scanf("%s", inFile); 	if ((fp = fopen(inFile, "r")) == NULL) 	{ 		printf("无法打开文件\n", inFile); 		system("pause"); 		exit(0); 	} 	int i = 0; 	while (fgets(line, LINE, fp)) 	{ 		n1 = n2 = 0; 		printf("获取文本: %s\n", line); 		evaluate(line, strlen(line)); 		for (i = 0; i < n1; i++) 			printf("第%d个整数是%d\n", i, num[i]); 		for (i = 0; i < n2; i++) 			printf("第%d个字符串是%s\n", i, str[i]); 	} 	return  0; } //请输入文件名: 1.txt //获取文本 : +123 00 ab - 123 -- //第0个整数是123 //第1个整数是0 //第2个整数是 - 123 //第0个字符串是ab //第1个字符串是-- //获取文本 : abc++ + abc - abc //第0个字符串是abc //第1个字符串是++ //第2个字符串是 + abc //第3个字符串是 - abc

user: user-0
content: 引用 3 楼 zhangxiangDavaid 的回复:有些特殊输入没有处理 如 ajsdkk   -  asdkjl  134 +  alsdk 正负号后面跟的不是数字，你怎么办？  如果先不管这个问题的话，像2楼所说的getNum和getStr没有输出这个应该怎么改啊？我的意思是怎么输出……

user: user-2
content: 有些特殊输入没有处理 如 ajsdkk   -  asdkjl  134 +  alsdk 正负号后面跟的不是数字，你怎么办？

user: user-3
content: #include <stdio.h> #include <stdlib.h> #include <ctype.h> #define LINE 80  void getNum(char *buf, int *k, int *num) { 	int sign=1; 	/* 以下程序用来获取整型数*/ 	if(buf[*k]=='-') 	{ 		sign=-1;(*k)++; 	} 	*num=0; 	while(isdigit(buf[*k])) 	{ 		*num=*num*10+buf[*k]-'\0'; 		(*k)++;/*差个括号*/ 	} 	*num*=sign; }  void getStr(char *buf, int *k, char *str) { 	int i=0; 	/* 以下程序用来获取字符串*/ 	while(isalpha(buf[*k])) 	{ 		str[i]=buf[*k]; 		(*k)++; 		i++; 	} 	str[i]='\0'; }  void getData(char *buf, int *nNum, int num[], int *nStr, char str[][20]) { 	int k; 	k=0; 	while(buf[k]) 	{ 		while(buf[k] == ' ' || buf[k] == '\t') 			k++; 		if(isdigit(buf[k]) || buf[k] == '-') 			/* 调用getNum函数，获取整型数*/ 			getNum(buf,&k,num); 		else if(isalpha(buf[k])) 			/* 调用getStr函数，获取字符串*/ 			getStr(buf,&k,*str); 		while(buf[k] != ' ' && buf[k] != '\t' && buf[k] != '\0') 			k++; 	} }  void main() { 	FILE *fp; 	char buf[LINE], inFile[20]; 	int  i, nNum, num[10], nStr; 	char str[10][20]; 	printf("请输入文件名: "); 	scanf("%s", inFile); 	if((fp = fopen(inFile, "r")) == NULL) 	{ 		printf("无法打开文件\n", inFile); 		system("pause"); 		exit(0); 	} 	while( fgets(buf, LINE, fp) ) 	{ 		printf("获取文本: %s", buf); 		nNum = nStr = -1; 		getData(buf, &nNum, num, &nStr, str); 		for(i=0; i<=nNum; ) 			printf("整型数 %d: %d\n", ++i, num[i]); 		for(i=0; i<=nStr; ) 			printf("字符串 %d: %s\n", ++i, str[i]); 	} } /* 请输入文件名: exe2-3File.txt 获取文本:   -2 abc 8    string 整型数 1: -2 整型数 2: 8 字符串 1: abc 字符串 2: string 获取文本: 获取文本: 8     china  6  9  printf(" 整型数 1: 8 整型数 2: 6 整型数 3: 9 字符串 1: china 字符串 2: printf 获取文本:    4    6 fudan6 3  stracosed 整型数 1: 4 整型数 2: 6 整型数 3: 3 字符串 1: fudan 字符串 2: stracosed */   另外需要加上输出语句，不然你的getNum两个函数没有输出

user: user-4
content: #include<stdio.h> int main() {     const char *p = "sdfdsf345fdgfdg678";     const char *q = "123wer";     char a[100] = { 0 };     int i = 0;     if (sscanf(p,"%d", &i) > 0)     {         printf("p: i = %d\n", i);     }     else     {         sscanf(p,"%s", a);//a:"sdfdsf345fdgfdg678"         printf("p: a = %s\n", a);         sscanf(q,"%d", &i);         printf("q: i = %d\n", i);     } //    p: a = sdfdsf345fdgfdg678 //    q: i = 123     return  0; }