2014-05-12 20 views
8

Mã của tôi giống như máy nén văn bản, đọc văn bản bình thường và biến thành số, mỗi từ có một số. Nó biên dịch trong DevC++ nhưng không kết thúc, tuy nhiên, nó không biên dịch trong Ubuntu 13.10. Tôi nhận được một lỗi như trong tiêu đề trong Ubuntu "không xác định tham chiếu đến` strlwr '", mã của tôi là một chút dài vì vậy tôi không thể đăng nó ở đây, nhưng một trong những lỗi là từ đây:tham chiếu không xác định cho `strlwr '

//operatinal funcitons here 


int main() 
{ 

    int i = 0, select; 

    char filename[50], textword[40], find[20], insert[20], delete[20]; 

    FILE *fp, *fp2, *fp3; 

    printf("Enter the file name: "); 

    fflush(stdout); 

    scanf("%s", filename); 

    fp = fopen(filename, "r"); 

    fp2 = fopen("yazi.txt", "w+"); 

    while (fp == NULL) 
    { 

     printf("Wrong file name, please enter file name again: "); 

     fflush(stdout); 

     scanf("%s", filename); 

     fp = fopen(filename, "r"); 

    } 

    while (!feof(fp)) 

    { 

     while(fscanf(fp, "%s", textword) == 1) 

     { 

      strlwr(textword); 

      while (!ispunct(textword[i])) 
      i++; 

      if (ispunct(textword[i])) 

      { 

       i = 0; 

       while (textword[i] != '\0') 
       i++; 

       i--; 

       while (ispunct(textword[i])) 
       i--; 

       i++; 

       i=0; 

       while (isalpha(textword[i])) 
       i++; 

       textword[i] = '\0'; 

      } 

      addNode(textword); 

     } 

    } 

.... //main continues 
+0

khi gọi bất kỳ của 'scanf()' chức năng: 1) luôn luôn kiểm tra giá trị trả về (không phải là giá trị tham số) để đảm bảo cuộc phẫu thuật đã thành công. 2) khi sử dụng các thông số đầu vào '% s' và'% [...] ', luôn bao gồm một biến tố MAX CHARACTERS nhỏ hơn độ dài của trường đầu vào để tránh tràn bộ đệm vì a) chúng sẽ tiếp tục nhập ký tự cho đến khi điều kiện kết thúc, vì vậy có thể tràn bộ đệm đầu vào (hành vi không xác định) và bởi vì các định dạng đầu vào đó luôn thêm một byte NUL vào đầu vào. – user3629249

+0

liên quan đến: 'while (! Feof (fp))' [why 'while (! Feof (fp))' luôn sai] (https://stackoverflow.com/questions/5431941/why-is-while-feof- file-always-wrong) – user3629249

+0

liên quan đến: 'while (ispunct (từ văn bản [i])) i--; i ++; i = 0; 'Điều này là vô nghĩa. Nó sẽ luôn luôn dẫn đến 'i' được đặt thành 0 – user3629249

Trả lời

17

strlwr() không phải là hàm C chuẩn. Có lẽ nó được cung cấp bởi một thực hiện trong khi trình biên dịch khác mà bạn sử dụng thì không.

Bạn có thể dễ dàng thực hiện nó cho mình:

#include <string.h> 
#include<ctype.h> 

char *strlwr(char *str) 
{ 
    unsigned char *p = (unsigned char *)str; 

    while (*p) { 
    *p = tolower((unsigned char)*p); 
     p++; 
    } 

    return str; 
} 
+1

Chỉ trong trường hợp' char' được ký, bạn nên sử dụng 'str [i] = tolower ((unsigned char) str [i]);'. –

+0

@BlueMoon Cảm ơn ngài, tôi đã làm như bạn đã nói và nó trở nên sống động. Tuy nhiên tôi thấy strcmp() như là một chức năng C standart và đó là lý do tại sao tôi sử dụng nó. Cám ơn bạn một lần nữa. – mrtgnccn

+0

strcmp() ** là ** một hàm chuẩn, trong khi strlwr() thì không. Các tài liệu của strlwr() đã có thể đề cập về nó (tôi hy vọng!). –

Các vấn đề liên quan