oj编译器通过不了gets

oj编译器通过不了gets,第1张

oj编译器通过不了gets是因为没有使用stdio.h头文件。根据查询相关公开信息显示:gets函数是包含在stdio.h头文件内的,在oj编译器内使用时需要添加stdio.h头文件才能通过。

运行结果不对。并未按题目要求,题目要求输入正整数n,再输入n行字符串,一共需要输入n+1行。输出为连续n行。你的程序每输入一个字符串就输出一个结果。

而且用scanf("%s",s)也不对。例如遇到空格或制表符时,采用%s格式的话就会认为读取结束,而并不能读取整个字符串,导致判断结果有误。

提供本题程序如下:

#include <stdio.h>

#include <string.h>

int main()

{

int i,j,n,m,b[10]

char a[10][50]

scanf("%d",&n)

for(i=0i<ni++)

b[i]=0

getchar()

for(i=0i<ni++)

{

gets(a[i])

m=strlen(a[i])

if(m>31)

{b[i]=1break}

else for(j=0j<mj++)

if((a[i][j]<'a'||a[i][j]>'z')&&(a[i][j]<'A'||a[i][j]>'Z')&&(a[i][j]<'0'||a[i][j]>'9')&&(a[i][j]!='_'))

{b[i]=1break}

}

for(i=0i<ni++)

b[i]?printf("\nno"):printf("\nyes")

return 0

}

运行示例:

runtime error是运行时出错,很可能是你程序设置的输入方式和系统给测试数据的方式不同导致。

请把题目放上来,这样别人还能帮你看看你的程序是不是按照题目要求去做了,以及有没有逻辑上的错误。

用数组模拟栈来做,代码如下,看不懂的地方再Hi我吧,栈的原理可以百度百科里看。不用栈的方法就像windning说的那样。

#include <stdio.h>

#define MAXSIZE 1000

int Match(char *str)

int main()

{

int i, n

char str[MAXSIZE]

scanf("%d", &n)

for (i = 1i <= n++i)

{

scanf("%s", str)

printf("%s\n", Match(str) ? "YES" : "NO")

}

return 0

}

int Match(char *str)

{

int top

char s[MAXSIZE]

top = 0

while (s[top] = *str++)

{

if (s[top] == '(' || s[top] == '[')

++top

else if (s[top] == ')' &&top >0 &&s[top-1] == '(')

--top

else if (s[top] == ']' &&top >0 &&s[top-1] == '[')

--top

else

return 0

}

return top ? 0 : 1

}

不用栈的作法:算法思想是,每次寻找一对匹配的括号(这一对匹配的括号位置是挨着的),并将这对匹配的括号从原字符串中删除。如果经过若干次“寻找”,“删除” *** 作后字符串的长度变成0,表示输入的字符串是匹配的,否则是不匹配的。

举个例子:比如说输入([[]()]),那匹配的过程就是,

1.找第一对匹配的括号,找到的是[],将[]删除后变成([()])

2.找第二对匹配的括号,找到(),将()删除后变成([])

3.找第三对匹配的括号,找到[],将[]删除后变成()

4.找第四对匹配的括号,找到(),将()删除后变成空串,表示匹配成功。

再举个例子:比如说输入([](),那匹配的过程就是,

1.找第一对匹配的括号,找到的是[],将[]删除后变成(()

2.找第二对匹配的括号,找到(),将()删除后变成(

3.找第三对匹配的括号,找不到匹配的括号,此时字符串里还有一个字符(,表示匹配不成功。

具体见代码,调试一下就明白了。

#include <stdio.h>

#include <string.h>

#define MAXSIZE 1000

int Match(char str[])

int main()

{

int i, n

char str[MAXSIZE]

scanf("%d", &n)

for (i = 1i <= n++i)

{

scanf("%s", str)

printf("第%d次输入处理结果:\n", i)

printf("%s\n", Match(str) ? "Yes" : "No")

}

return 0

}

int Match(char str[])

{

int i, j, len, flag, count

flag = 1//flag等于1表示当前可能还有未匹配的括号

count = 1//记录是第几次删除,调试观察用

while (flag &&strlen(str))

{

flag = 0 //假设当前字符串是匹配的

//每次for循环查找一对匹配的括号

for (i = 0i <strlen(str)++i)

if ((str[i] == '(' &&str[i+1] == ')') || (str[i] == '[' &&str[i+1] == ']'))

{

flag = 1 //flag等于1表示当前可能还有未匹配的括号

break

}

//以下打印信息可以方便的看到程序运行的过程

printf("---------------\n")

printf("第%d次删除前:%s\n", count, str)

//该for循环用于将上面for循环里找到的一对匹配的括号从原字符串中删除

for (j = ij <strlen(str)++j)

str[j] = str[j+2]

printf("第%d次删除后:%s\n", count, str)

++count

}

return strlen(str) ? 0 : 1 //如果字符串中还有无法消除的字符,表示括号匹配不成功

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8122177.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-13
下一篇2023-04-13

发表评论

登录后才能评论

评论列表(0条)

    保存