初级C程序员有string函数的问题

我是一个C noob,回到学校我的主人在CS,所以我花了一些时间来提高我的技能。 我想看看是否有人可以提供一些帮助,为什么我有问题编译下面的代码。 我一直在关注WiBit.net上的video,并在64位Linux环境(Ubuntu 13.10)上开发。 我正在使用gedit和gcc编译器没有IDE。

这个代码在我的Win 7虚拟机上运行没有错误,但是当我尝试在我的主机Linux环境中执行它时,我收到错误:

源代码:这个例子调用了strcmp和strcmpi函数

#include <stdio.h> #include <string.h> int main() { char str1[255]; char str2[255]; printf("str1: "); gets(str1); printf("str2: "); gets(str2); if(strcmp(str1, str2) == 0) printf("Strings match exactly!"); else if(strcmpi(str1, str2) == 0) printf("Strings match when ignoring case!"); return 0; } 

错误信息(仅限Linux):

$ gcc main.c -o demo -lm -pthread -lgmp -lreadline 2>&1 /tmp/ccwqdQMN.o:在函数main': main.c:(.text+0x25): warning: the .text main': main.c:(.text+0x25): warning: the gets函数是危险的不应该使用。 main.c :(。text + 0x8f):未定义引用'strcmpi'collect2:错误:ld返回1退出状态

源代码2:这个例子使用了strupr和strlwr函数

 #include <stdio.h> #include <string.h> int main() { char str1[255]; char str2[255]; printf("str1: "); gets(str1); printf("str2: "); gets(str2); strlwr(str1); strupr(str2); puts (str1); puts (str2); return 0; } 

错误信息(仅限Linux):

$ gcc main.c -o demo -lm -pthread -lgmp -lreadline 2>&1 /tmp/ccWnIfnz.o:在函数main': main.c:(.text+0x25): warning: the .text main': main.c:(.text+0x25): warning: the gets函数是危险的不应该使用。 main.c :(。text + 0x57):未定义的参考strlwr' main.c:(.text+0x6b): undefined reference to strupr'collect2:错误:ld返回1退出状态

如果有人愿意帮忙,不要把我分开,我会喜欢详细的解释。 我知道,对于最佳实践,我们不应该使用获取缓冲区溢出(例如,用户input一个750字符的string)。 最佳做法将使用fgets,而我的问题是我是否得到这些错误,因为这些function不是ANSI C或什么的一部分。 他们确实显示在我的机器上的文件,这是扔我循环。

提前致谢!


更新:你们真棒。 接受了所有的build议和意见,并能够修改和制作一个string比较样例程序以及上/下转换。 很高兴我能够得到它运行在两个操作系统错误免费以及。

示例代码:

 #include <stdio.h> #include <string.h> #include <ctype.h> int main() { char str[255]; printf("Enter a string: "); fgets(str,255, stdin); printf("Here is your original string, my master: %s\n", str); //Now let's loop through and convert this to all lowercase int i; for(i = 0; str[i]; i++) { str[i] = tolower(str[i]); } printf("Here is a lowercase version of your string, my master: %s\n", str); //Now we'll loop through and convert the string to uppercase int j; for(j = 0; str[j]; j++) { str[j] = toupper(str[j]); } printf("Here is a uppercase version of your string, my master: %s\n", str); return 0; } 

strcmpi问题:strcasecmp()是posix标准,在linux中也是如此。

虽然你可以用一行代码实现它们,但是在glibc中不存在strupr和strlwr,如下所示: c – 将一个混合大小写的字符串转换为全部小写

在编译过程中,首先你可以找到一个警告,因为gcc没有在包含的头文件中找到函数。 在这种情况下,它认为它们被声明为int funcname(void)。 但后来在链接的时候,找不到这个不可靠的函数的导出符号,因此无法创建可执行文件。 第二个错误是停止编译。

在c apis中有太多的差别,虽然posix标准处理它们,但微软并没有遵循它。

正如你所说的, gets函数是不安全的,因为它没有执行任何边界检查:你用255个字符的字符串缓冲区调用它,但是如果另外一个程序写了一个超过255个字符的行,它可以把数据写入你的进程的栈,从而导致您的进程执行恶意代码(至少会产生分段错误)。

改用fgets

 printf("str1: "); fgets(str1, 255, stdin); printf("str2: "); fgets(str2, 255, stdin); 

如果您仔细阅读编译器的错误输出,您会注意到,在使用gets时不会发出错误,而是发出警告。 如果您修复strcmpi调用,您的代码仍然应该编译和执行。