【发布时间】:2013-12-27 03:35:56
【问题描述】:
我是一名 C 菜鸟,要回学校攻读 CS 硕士学位,所以我需要一些时间来提高我的技能。我想看看是否有人可以为我在编译以下代码时遇到问题提供一些帮助。我一直在关注 WiBit.net 上的视频并在 64 位 Linux 环境(Ubuntu 13.10)上进行开发。我正在使用 gedit 而 gcc 编译器没有 IDE。
这段代码在我的 Win 7 VM 上运行没有错误,但是当我尝试在我的主机 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: thegets 中,函数很危险,不应使用。
main.c:(.text+0x8f): undefined reference to `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: thegets 中,函数很危险,不应使用。
main.c:(.text+0x57): 未定义对strlwr'
main.c:(.text+0x6b): undefined reference tostrupr' 的引用
collect2:错误:ld 返回 1 个退出状态
如果有人愿意帮助而不是将我拆散,我希望得到详细的解释哈哈。我知道,对于最佳实践,由于缓冲区溢出(例如用户输入 750 个字符的字符串),我们不应该使用 get。最佳实践将使用 fgets 代替,但我的问题是我是否收到这些错误,因为这些函数不是 ANSI C 或什么的一部分。它们确实出现在我机器上的 man 文件中,这让我陷入了一个循环。
提前致谢!
更新: 你们真棒。接受了您的所有建议和 cmets,并且能够修改并制作用于字符串比较以及转换为上/下的示例程序。很高兴我能够让它在两个操作系统上都无错误地运行。
示例代码:
#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;
}
【问题讨论】:
-
您应该查看cplusplus.com/reference/cstring 以获取对标准 C 字符串库的参考。
-
如果你使用 gcc,你真的应该使用
-Wall来获得关于有问题的警告。 -
谢谢克里斯。为此,我正在研究更多的命令行开关。我接触 C++ 已经有 5 年了,现在我要在回到学校之前及时回到古老的 C 语言。