未定义对“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 && 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”的引用的主要内容,如果未能解决你的问题,请参考以下文章