未定义对“strlwr”的引用

Posted

技术标签:

【中文标题】未定义对“strlwr”的引用【英文标题】:undefined reference to `strlwr' 【发布时间】:2014-05-12 20:32:35 【问题描述】:

我的代码就像一个文本压缩器,读取普通文本并变成数字,每个单词都有一个数字。它可以在 DevC++ 中编译,但不会结束,但是,它不会在 Ubuntu 13.10 中编译。我在 Ubuntu 中的标题“未定义对‘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("text.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);

            //some other logic

        

    

.... //main continues

【问题讨论】:

在调用任何scanf() 函数时: 1) 始终检查返回值(而不是参数值)以确保操作成功。 2) 使用输入说明符%s%[...] 时,始终包含比输入字段长度小1 的MAX CHARACTERS 修饰符以避免缓冲区溢出,因为a) 它们将继续输入字符直到终止条件,所以可能会溢出输入缓冲区(未定义的行为),并且因为这些输入格式说明符总是将 NUL 字节附加到输入。 关于:while (!feof(fp))why 'while( !feof(fp) )' is always wrong 【参考方案1】:

strlwr() 不是标准 C 函数。可能它是由一个实现提供的,而您使用的另一个编译器则没有。

您可以自己轻松实现:

#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;

【讨论】:

万一char被签名,你应该使用str[i] = tolower((unsigned char)str[i]); @BlueMoon 谢谢你,先生,我按照你说的做了,它还活着。但是,我将 strcmp() 视为标准 C 函数,这就是我使用它的原因。再次感谢您。 strcmp() 一个标准函数,而 strlwr() 不是。 strlwr() 的文档会提到它(我希望!)。 @BlueMoon: 仅供参考:在 Linux 上(特别是 Ubuntu 14.04,特别是 GCC 4.8.2,但我认为它通常对 x86 和 x86_64 版本的 Linux 有效),纯 char 是签名的类型;范围是CHAR_MIN == -128 &amp;&amp; CHAR_MAX == +127。同样适用于 Mac OS X 10.9.2 Mavericks 和 GCC 4.9.0。【参考方案2】:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char* strlwr(char* );
int main() 

  printf("Please Enter Size Of The String: \n");
  int a,b;
  scanf("%d",&a);
  char* str;
  str=(char*)malloc(sizeof(char)*a);
  scanf("\n%[^\n]",str);
  char* x;
  x=strlwr(str);
  for(b=0;x[b]!='\0';b++)
  
    printf("%c",x[b]);
  
  free(str);
  return 0;

char* strlwr(char* x)

  int b;
  for(b=0;x[b]!='\0';b++)
  
    if(x[b]>='A'&&x[b]<='Z')
    
      x[b]=x[b]-'A'+'a';
    
  
  return x;

【讨论】:

以上是关于未定义对“strlwr”的引用的主要内容,如果未能解决你的问题,请参考以下文章

对结构方法的未定义引用[重复]

解决:linux eclipse 对‘dlopen’未定义的引用, 对‘xxx’未定义的引用

对静态成员的未定义引用

错误:未定义对...的引用有啥问题? [复制]

编译错误 未定义的引用 怎么回事

显示对已定义对象的未定义引用