c语言 删除非法字符

提供思路:
1、使用strtok函数,进行切割,将符合规定的字符全部删除,然后使用strcat进行连接
2、不使用系统函数,使用循环遍历并且标记,标记完后将数组赋值到另一个数组里边,标记的位置直接跳过

㈡ C语言编译过重中出现的 非法字符,可我怎么也找不出 ,请问这非法字符可能是什么

fun1里

int fun1(int year,int month,int day) /*查询某年某月某日星期几*/
{ int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int s,c=0,i;
if( fun2(year)==rn) /*判断某年是否闰年*/
a[2]=29;
for(i=1; i<=12; i++ ) /*计算 1月至某月的前一个月的天数*/
c=c+a[i-1];
c=c+dd; /*再加上某月当月的实际天数*/
s=year-1+(year-1)/4-(year-1)/100+(year-1)/400+c;
return s%7;
}

这一句
s=year-1+(year-1)/4-(year-1)/100+(year-1)/400+c;

第三个减号是全角的,替换成下面这行试试
s=year-1+(year-1)/4-(year-1)/100+(year-1)/400+c;

祝你好运^_^

㈢ 这段C语言程序中一直提示有非法字符怎么办,我找不出来啊

for(k=0;k<n;k++){p=(struct btnode*)malloc(sizeof(struct btnode));p->d=a[k];p->lchild=NULL;p->rchild=NULL;q=bt;if(q==NULL) bt=p;else {while((q->lchild)!=p)&&(q->rchild)!=p)){if(a[k]<q->d){if(q->lchild!=NULL) q=q->lchild;else q->lchild=p;}else{if(q->rchild)!=NULL) q=q->rchild;else q->rchild=p;}}}}return bt;}
都是内的容

㈣ 2. 是非法的C语言转义字符。 A) ’\b’ B) ’\0xf’ C.'037'D'\"

A \b本身是转义字符 正确.
B 如果要16进制, 需要写成 '\xf' 字符转义的时候不需要写0x的.
C '\037'才对专, 这种是8进制属转义.
D 这里应该不是双引号 而是'\'' 即 两个单引号包含的一个\' 表示单引号转义.
如果不是你打错了话, 那么BC都是错的.

㈤ C程序非法字符问题

#include "stdio.h"
#define NULL 0

#define SS sizeof(struct stu)
typedef struct stu
{ int num;
int name[10];
struct stu *llink,*rlink;
}ss;
ss *list()
{ ss *h,*r,*s;
int i;int n=5;
if((h=(ss *)malloc(SS))==NULL)
{ printf("wrogn !");
}
h->num=NULL;
h->llink=NULL;
h->rlink=NULL;
h->name[0]='\0';
r=h;
for(i=0;i<n;i++)
{ s=(ss *)malloc(SS);
r->rlink=s;
printf("inter :\n");
scanf("%d%s",&s->num,&s->name);
s->llink=r;
s->rlink=NULL;
r=s;
}
h->llink=r;////////////////////
r->rlink=h;////////////////
return h;
}

void input(ss *head)
{ ss *p;
p=head->rlink;
if(p!=head)///////
do******
{ printf("%2d%4s\n",p->num,p->name);
p=p->rlink;
}while(p!=head);//////////
}
main()
{ ss *head;
head=list();
printf("\n ht put is :\n");
input(head);
getch();
}
你是建立的一个循环链表啊,不是一个单链表,为什么还要用NULL?多注意一些逻辑上的错误,再就是,非法字符,其实最好是在剪贴然后再txt中粘贴一下,在从其上复制,再粘贴到win tc就行了,一般再就是把上下行重复输入一遍就行了,

㈥ C语言编程问题,求高手解答遇到输入非法字符时,怎么处理。

#include<stdio.h>
#include<time.h>
#include <stdlib.h>
#include "regex.h"

const int MAX_LEN = 1000;
/*去掉字符串两端的空格*/
char * trimString(char guessString[])
{
int head = 0 ,rear = strlen(guessString)-1;
char result[MAX_LEN];
int i,k;
/*开头空格*/
while( guessString[head] != '\0' &&
(guessString[head] == ' ' || guessString[head] == ' ' )
)
{
head ++;
}

/*尾部空格*/
while( rear >= 0 &&
(guessString[rear] == ' ' || guessString[rear] == ' ' )
)
{
rear --;
}
for(i = head ,k = 0; i <= rear ; i++ , k++)
{
result[k] = guessString[i];
}
result[k] = '\0';

return result;
}

/*
提取字符串中的【正整数】。
如果是恰好包含【一个正整数】的字符串(正数前后可以有任意个空格,正数可以有多余的前导0),则返回这个正数;
如果是一个空串,则返回 -1
如果包含非数字字符,则返回-2
*/
int transStringToNum(char guessString[])
{
int i;
int head = 0 ,rear = strlen(guessString)-1;
char trimGuessString[MAX_LEN];
int num = 0;
// 去前后空格
strcpy(trimGuessString,trimString(guessString));
// 检查是否空串
if( 0== strlen(trimGuessString) )
{
return -1;
}
// 检查是否有非数字字符
for(i = 0 ; trimGuessString[i] != '\0' ; i ++)
{
if(trimGuessString[i] < '0' || trimGuessString[i] > '9')
{
return -2;
}
}
// 字符串转换成数字
for(i = 0 ,num = 0 ; trimGuessString[i] != '\0' ; i++)
{
num = num * 10 + (trimGuessString[i] - '0');
}
return num;
}

int main()
{
int num,guessNum,n,count=0;
char guessString[MAX_LEN];
char reply;
srand(time(NULL));
do
{
//产生一个随即数
num=rand()%100+1;

printf("你有10次机会,请猜数字并按回车。\n");
for(n=1;n<=10;n++)
{

// 以字符串形式读入一个整数
gets(guessString);

/*
调用函数 transStringToNum 进行有效性验证
当返回值 guessNum 是负数时,
字符串 guessString 中没有合法的正数
*/
guessNum = transStringToNum(guessString);
if(guessNum == -1 )
{
printf("请输入一个数字(必须是在1-100 之间)!\n");
n--;
continue;
}

if(guessNum == -2 )
{
printf("输入的不是一个合法数字(必须是在1-100 之间)!\n");
n--;
continue;
}

if(guessNum>num)
{
printf("It's too high!\n");
}
else if(guessNum<num)
{
printf("It's too low!\n");
}
/*
这里有误,是 == 而不是 =
因为你刚好把这个分支放在最后,因此察觉不到错误
如果你写成
if(guessNum = num) else if(guessNum>num) else if(guessNum<num)
就知道错了。这时if(guessNum = num)永远都会被执行
因为这是一个【赋值语句】而不是【逻辑语句】,且 num 的值是恒正的
*/
else if(guessNum == num)
{
printf("You are right!\n");
printf("你共用了%d次机会猜对数字。\n",n);
break;
}
}

printf("Do you want to continue(Y/N or y/n)?");
/*
用 getch() 取代scanf ,不易出错
因为 getch()只能输入一个字符
而 scanf 可以读入多个字符,而且要回车
*/
fflush(stdin);
reply = getch();

}while((toupper(reply)=='Y'));
printf("The game is over!\n");
return 0;
}
/*
输入合法数字示例(数字包含在一对""中):
"123"
" 123"
"123 "
" 123 "
" 0000123 "

上面的结果都是输入正数: 123
*/

㈦ c语言中非法字符有哪些

首先看定义,用单引号括起来的单个字符,或用双引号括起来的一串字符即字符常量内。
C '&' 是用单引号括起来容的单个字符,正确。
A '\xff' B '\65' D'\028' 是用单引号括起来的多个字符,但因它们前面都 有一个转义符 ‘\‘ ,就不能说它们都不符合定义,都不合法的。

A '\xff' 中 '\x' 组合表示是一个十六进制数 ffH = 10 进制的 255 ,它代表一个不可见字符的ASCII 码, 合法 。

B '\65' 同理 '\' + 三个十进制数 '\ddd' 表示的是 八进制数。'\65' = '\065' = 10 进制的 53, 是 ‘F’ 的ASCII 码表示。单 字,合法。

D '\028' 同上表示是八进制数,但八进制数中逢八则进一,是不会出现 8 的,所以格式虽对但数值错了。不合法。

㈧ 求一个在c语言中提示输入非法字符程序

|

#include<stdio.h>
voidmain(void)
{
charch;
printf("请输入复一个字制符:");
scanf("%c",&ch);
if(ch>'A'&&ch<'Z'||ch>'a'&&ch<'z')
{
printf("");

}else
printf("非法字符!");
}

㈨ 关于C语言控制非法字符和scanf缓存的问题

scanf("%d %d",&num[k],&score[k]);
if(scanf("%d",&score[k])!=1)

你这一句scanf("%d %d",&num[k],&score[k]);已经读入成绩了,就算输入错误也不能做出处理。
你下面再加一个if(scanf("%d",&score[k])!=1),这会使score[k]读入一个新值,即score[k]被读入了两次,你也被要求输入两次。
你要明白:scanf("%d",&score[k])!=1这个语句作为判断条件有两个功能,一是读入一个值并把值赋给score[k],二是判断是否成功读入了一个值,如果是,你这个条件就为假。

㈩ C语言中,出现非法字符时会发出错误对吗

是的,会编译不通过,而且报的错误千奇百怪。

最常见的就是中文字符了。

合法字符见ascii码表。