当我尝试编译使用gets()GCC函数的C代码时,
我明白了
警告:
(.text + 0x34):警告:`gets'函数很危险,不应该使用.
我记得这与堆栈保护和安全性有关,但我不确定为什么?
有人可以帮我删除这个警告并解释为什么会有这样的使用警告gets()?
如果gets()是如此危险,为什么我们不能删除它?
我试图从用户那里获取一些数据并将其发送到gcc中的另一个函数.代码是这样的.
printf("Enter your Name: ");
if (!(fgets(Name, sizeof Name, stdin) != NULL)) {
fprintf(stderr, "Error reading Name.\n");
exit(1);
}
Run Code Online (Sandbox Code Playgroud)
但是,我发现它最后有一个换行符\n.所以,如果我输入John它最终发送John\n.如何删除它\n并发送正确的字符串.
由于未进行比较,此代码无效.为什么?
所有的名字都过去了if.
printf("Enter Product: \n");
scanf("%s", &nameIt2);
printf("Enter Description: \n");
scanf("%s", &descriptionI);
printf("Enter Quantity: \n");
scanf("%d", &qtyI);
printf("Enter Order Quantity: \n");
scanf("%s", &ordqtyI);
while (fscanf(fp4, "%s %s %d %s\n", &namet2, &description2, &qty2, &ordqty2) != EOF){
if(namet2 != nameIt2)
fprintf(fpt2, "%s %s %d %s\n", &namet2, &description2, qty2, &ordqty2);
}
Run Code Online (Sandbox Code Playgroud) 当我调用C字符串比较函数时,如下所示:
strcmp("time","time")
它返回0,这意味着字符串不相等.
任何人都可以告诉我为什么C实现似乎这样做?我认为如果相等,它将返回非零值.我很好奇我看到这种行为的原因.
int main (int argc, **argv)
{
if (argv[1] == "-hello")
printf("True\n");
else
printf("False\n");
}
Run Code Online (Sandbox Code Playgroud)
# ./myProg -hello False
为什么?我意识到strcmp(argv[1], "-hello") == 0返回true ...但为什么我不能使用相等运算符来比较两个C字符串?
我在这里有一个结构,例如:
char *sname;
........
players[i].sname
Run Code Online (Sandbox Code Playgroud)
等于"詹姆斯".
我需要检查值之间的相等性,如下所示:
if (players[i].sname == 'Lee')
Run Code Online (Sandbox Code Playgroud)
但我没有太多运气.是否有一个str*我应该使用的功能,或者无论如何都要修复我的if陈述?
如何比较这两个字符数组以确保它们相同?
char test[10] = "idrinkcoke"
char test2[10] = "idrinknote"
Run Code Online (Sandbox Code Playgroud)
我正在考虑使用for loop,但我在其他地方读到了我无法test[i] == test2[i]用C 做的事情.
如果有人能帮到我,我真的很感激.谢谢.
我试图用C语言编程,但并不成功.我有一个简单的源代码,我需要匹配多个字母if (char).它显示以下错误消息(在使用gcc的linux终端中):
main.c:在函数`main'中:main.c:16:23:警告:字符常量对于其类型太长[默认启用]
if(firstName [20] =='Vojta'){
源代码:
#include <stdio.h>
int main(int argc, char const *argv[])
{
/* code */
char firstName[20];
char lastName[40];
char password[20];
char confpasswd[20];
int age;
printf("Please write your first and last name:");
scanf("%s%s", firstName, lastName);
printf("%s %s:\n", firstName, lastName);
if (firstName[20] == 'Vojta'){
printf("\ncool\n");
}
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我用C编写了这段代码:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
int main()
{
char string1[20];
char string2[20];
strcpy(string1, "Heloooo");
strcpy(string2, "Helloo");
printf("%d", strcmp(string1, string2));
return(0);
}
Run Code Online (Sandbox Code Playgroud)
控制台打印值是1还是字符和字符ASCII值之间的差值,即111?在这个网站上写道,这应该给出111,但当我在我的笔记本电脑上运行时,它显示1.为什么?o\0
首先,考虑这个例子:
#include <iostream>
using namespace std;
int main()
{
cout << ("123" == "123");
}
Run Code Online (Sandbox Code Playgroud)
我期望什么:由于“123”是一个const char*,我期望对这些字符串的地址(如这些答案之一所述)进行比较。
...因为
!=和==只会比较这些字符串的基地址。不是字符串本身的内容。
但输出仍然是1. 好吧,我们实际上不知道如何比较两个纯右值对象的地址(或者至少我不明白它是如何完成的)。因此,让我们将这些字符串声明为变量,看看会发生什么:
#include <iostream>
using namespace std;
int main()
{
const char* a = "1230";
const char* b = "1230";
cout << (a == b);
}
Run Code Online (Sandbox Code Playgroud)
输出仍然是1. 那么const char*琴弦不会衰减吗?或者编译器设法进行一些优化并仅为一个字符串分配内存?好吧,让我们尝试避免它们:
#include <iostream>
using namespace std;
int main()
{
const char* a = "1230";
const char* b = "1231";
b …Run Code Online (Sandbox Code Playgroud)