C 对“strlwr'”的未定义引用;

C 对“strlwr'”的未定义引用;,c,string,linker-errors,C,String,Linker Errors,我的代码就像一个文本压缩器,读取普通文本并转换成数字,每个单词都有一个数字。它在DevC++中编译,但没有结束,然而,它不在ubuntu13.10中编译。我遇到了一个类似于Ubuntu标题“未定义的对`strlwr`的引用”的错误,我的代码有点长,所以我无法在这里发布,但其中一个错误来自这里: //operatinal funcitons here int main() { int i = 0, select; char filename[50], textword[40

我的代码就像一个文本压缩器,读取普通文本并转换成数字,每个单词都有一个数字。它在DevC++中编译,但没有结束,然而,它不在ubuntu13.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
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*strlwr(char*str)
{
无符号字符*p=(无符号字符*)str;
而(*p){
*p=tolower((无符号字符)*p);
p++;
}
返回str;
}
#包括
#包括
#包括
char*strlwr(char*);
int main()
{
printf(“请输入字符串的大小:\n”);
INTA,b;
scanf(“%d”和“&a”);
char*str;
str=(char*)malloc(sizeof(char)*a);
scanf(“\n%[^\n]”,str);
char*x;
x=strlwr(str);
对于(b=0;x[b]!='\0';b++)
{
printf(“%c”,x[b]);
}
自由基(str);
返回0;
}
char*strlwr(char*x)
{
int b;
对于(b=0;x[b]!='\0';b++)
{

如果(x[b]>='A'&&x[b]只是为了以防万一
char
被签名,你应该使用
str[i]=tolower((unsigned char)str[i]);
@BlueMoon谢谢你,先生,我按照你说的做了,它就活了。但是我把strcmp()看作是一个标准的C函数,这就是我使用它的原因。再次感谢你。strcmp()是一个标准函数,而strlwr()不是。strlwr()的文档可能会提到这一点(我希望!)。@BlueMoon:FYI:在Linux上(特别是Ubuntu 14.04,特别是GCC4.8.2,但我认为它对x86和x86_64版本的Linux通用有效),plain
char
是一种有符号类型;范围是
char\u MIN==-128&&char\u MAX==+127
。Mac OS X 10.9.2 Mavericks和GCC 4.9.0也是如此。调用任何
scanf()
函数时:1)始终检查返回值(而不是参数值)确保操作成功。2)使用输入说明符
%s
%[…]时
,始终包含一个小于输入字段长度的MAX CHARACTERS修饰符,以避免缓冲区溢出,因为a)它们将继续输入字符直到终止条件,因此可能会溢出输入缓冲区(未定义行为)因为这些输入格式说明符总是在输入中附加一个NUL字节。关于:
while(!feof(fp))
#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;
}