非法文件:无法打开(/ dev / tty)USACO错误

时间:2014-07-22 22:31:39

标签: c

我正在研究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;
}

1 个答案:

答案 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'空字符。)