2012-10-19 30 views
0

我試圖寫一個程序,從用戶讀取一個文件名輸入,並將其存儲再後來就會檢查輸入的文件名是在當前目錄。我遇到的問題是,當用戶輸入目錄中不存在的文件的文件名時,則使用名稱長於先前名稱的文件名,但如果用戶首先輸入一個長的不存在的文件名,確實存在的較短的一個STAT()不是在「名稱」工作大名

stat(name, &check)<0 

並沒有罰款。 我想知道是否因爲'名稱'在第二個實例是一個數組與正確的文件名,但然後'\ 0的填充它的大小,前一個較大的錯誤嘗試輸入與它比較文件名。有沒有什麼辦法可以在不使用fflush的情況下清除「名稱」的每次嘗試?

char *filename(int *valid_input) 
{ 

    /* Need to malloc name, dat and prefix if doing it this way. */ 
    int valid1, valid2, valid3, i, n; 
    char c, *name; 
    char dat[5], prefix[16]; 
    struct stat check; 

    name = malloc(14*(sizeof(char))); 

    if(name==NULL) 
    { 
     printf("Memory could not be allocated."); 
     exit(EXIT_FAILURE); 
    } 

    printf("\nPlease enter a filename in the form 'yourfile.dat'.\nUse only lowercase letters a-z and numerals 0-9 in the prefix. \n The prefix should be 10 characters or less.\nIf you wish to quit enter 'q'.\n\nInput filename : "); 

    *valid_input = 0; 

    while(*valid_input == 0) 
    { 
     valid1=0; valid2=0; valid3=0; 

     __fpurge(stdin); 
     printf("hello1"); 

     while(valid1==0) /* Checks input is at least 5 characters long, 14 maximum. */ 
     { 
      printf("hello2"); 
      n = 0; 
      valid1 = 1; 

      __fpurge(stdin); 

      while ((c=(char)getchar()) != '\n') /* Reads in input */ 
       { 
        printf("hello3"); 
        if(n<14) 
        { 
         name[n]=c; 
         /*printf("%c",name[n]); */ 
         if((name[n]=='\n')||(name[n]==EOF)||(name[n]=='\0')) break; 
        } 
        ++n; 
       } 

      /* printf("check"); */ 
      if(((n>=14)&&(name[14]!='t'))||(n<5)){printf("hello1"); valid1 = 0;} /* Checks input has a prefix and is less than      14 characters total */ 

      if((name[0]=='q')&&(n==1)){printf("hello"); break;} 

      if(valid1 > 0) break; 

      /* printf("Length of name = %d n = %d ",strlen(name),n);*/ 
      printf("\nYour filename should contain a prefix of up to 10 characters. \nTo quit press 'q'.\n\nInput filename : "); 
     } 

     if((name[0]=='q')&&(n==1)) break; 

     for (i=0;i<(n-4);i++) 
     { 

      prefix[i]=name[i]; 
      printf("\nprefixvalue = %c",prefix[i]); 
      if(((prefix[i]>='a')&&(prefix[i]<='z'))||((prefix[i]>='0')&&(prefix[i]<='9'))){ valid3+=1;} 
     } 
     if(valid3!=n-4) valid3=0; 
     else valid3=1; 

     for (i=0;i<4;i++) 
     { 
      dat[i]=name[n-4+i]; 
      if((dat[0]='.')||(dat[1]='d')||(dat[2]='a')||(dat[3]='t')) valid2=1; 
     } 

     if((valid2==0)||(valid3==0)) printf("\nYour filename should be in the form 'yourfile.dat' with only lowercase letters or numbers in the prefix.\nTo quit press q.\n\nInput filename : "); 

     *valid_input = valid1 && valid2 && valid3; 

     if(*valid_input==1) 
     { 
      if(stat(name, &check)<0) 
       { 
       printf("\n File does not exist in the current directory.\n Check and re-enter filename.\n To quit press q.\n\nfilename : "); *valid_input=0; 
       } 
     } 

    } 

    return(name); 
+0

這是哪種操作系統? MS-DOS? Unix 7? –

回答

5

您遇到的最大問題是您不會終止字符串name

首先,你應該分配一個或多個字符的終結:

name = malloc(15); /* C specifies that `sizeof(char)` is always 1 */ 

然後getchar循環之後,你應該終止字符串:

name[n] = '\0'; 
+0

謝謝,這就是它! –

1

除了發現缺陷由Joachim,還有另一種:

if(((n>=14)&&(name[14]!='t'))||(n<5)){printf("hello1"); valid1 = 0;} 

我沒有任何我DEA爲什麼name[14]!='t'具有特殊的意義,但在任何情況下,n是字符數讀到目前爲止,所以如果n == 14然後name[14],這是第十五字符,將尚未分配的這個測試將行爲異常。