我正在研究USACO在线培训问题,平地机给我以下错误:
运行2:执行错误:您的程序出现此运行时错误: 非法文件打开(/ dev / tty)。该程序运行0.000 CPU 错误前几秒。它使用了2160 KB的内存。
该程序可在我的计算机上运行(Windows 8:Codeblocks,mingw),但不适用于分级机(Linux)。甚至更奇怪的是测试1工作正常,但错误出现在第2轮。
根据相关的USACO帮助页面,错误很可能是由于某些超出范围的数组索引,但我无法找到错误。我的输入文件只是由空格分隔的两个整数,后跟换行符(在这种情况下输入为9 10
),输出文件看起来像
15
16
17
18
20
21
24
26
27
这是我的代码:
/*
TASK:dualpal
LANG:C
ID:tanishq1
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <string.h>
void strreverse(char * str)
{
if (str)
{
char *end = str + strlen(str) - 1;
// swap the values in the two given variables
// XXX: fails when a and b refer to same memory location
# define XOR_SWAP(a,b) do\
{\
a ^= b;\
b ^= a;\
a ^= b;\
} while (0)
// walk inwards from both ends of the string,
// swapping until we get to the middle
while (str < end)
{
XOR_SWAP(*str, *end);
str++;
end--;
}
# undef XOR_SWAP
}
}
int palindromecheck(char *palstring) {
char *reversepalstring;
reversepalstring = (char *)malloc(sizeof(palstring) * sizeof(char));
strcpy(reversepalstring,palstring);
strreverse(reversepalstring);
if (strcmp(reversepalstring,palstring) == 0) {
return 1;
}
else {
return 0;
}
}
char returnstring[34];
char *baseconvert(int number,int base) {
if(number == 0 || base == 10) {
sprintf(returnstring,"%d",number);
return returnstring;
}
int returnint = (number % base) + (10 * atoi(baseconvert(number / base, base)));
sprintf(returnstring,"%d",returnint);
return returnstring;
}
int main() {
FILE *inputfile = fopen("dualpal.in","r");
FILE *outputfile = fopen("dualpal.out","w");
int n;
int s;
fscanf(inputfile,"%d %d\n",&n,&s);
int i = 1, ncounter = 0, scounter = 1;
for (i; ncounter < n; i++) {
int j = 2;
int palindromesuccesscounter = 0;
for (j; j <= 10; j++) {
int palindrome = palindromecheck(baseconvert(s + scounter, j));
if (palindrome == 1) {
palindromesuccesscounter++;
}
}
if (palindromesuccesscounter > 1) {
fprintf(outputfile,"%d\n",s + scounter);
ncounter++;
}
scounter++;
}
fclose(inputfile);
fclose(outputfile);
return 0;
}
答案 0 :(得分:1)
根据相关的USACO帮助页面,错误很可能是由于某些超出范围的数组索引所致
在palindromecheck
函数中,您有:
int palindromecheck(char *palstring) {
char *reversepalstring;
reversepalstring = (char *)malloc(sizeof(palstring) * sizeof(char));
...
}
palstring
是一个指针,而不是一个数组,sizeof(palstring)
将给出指针的大小(可能是4或8个字节),而不是字符串的长度。
您需要使用strlen
来确定字符串的长度(并添加1以允许终止'\0'
空字符。)