Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么这个If语句不执行代码?_C_If Statement_Response_Generator - Fatal编程技术网

C 为什么这个If语句不执行代码?

C 为什么这个If语句不执行代码?,c,if-statement,response,generator,C,If Statement,Response,Generator,我已经检查了所有语法 #include <stdlib.h> #include <stdio.h> int main(){ char * response; int anger = 0; int correct = 0; printf("type Dice"); scanf("%s", response); if (response == "Dice"){ printf("Good Job!"); correct = 1; }

我已经检查了所有语法

#include <stdlib.h>
#include <stdio.h>

int main(){
  char * response;
  int anger = 0;
  int correct = 0;
  printf("type Dice");
  scanf("%s", response);
  if (response == "Dice"){
    printf("Good Job!");
    correct = 1;
  }
}
#包括
#包括
int main(){
字符*响应;
int anger=0;
int correct=0;
printf(“类型骰子”);
scanf(“%s”,响应);
如果(响应=“骰子”){
printf(“干得好!”);
正确=1;
}
}

我正在尝试生成响应生成器,但is语句不起作用。我试着将变量响应设置为正确答案,if语句起作用了,所以我想可能是我的scanf出了问题。我是C语言的初学者。

您不能使用==来比较字符串。请改用strcmp()。如果返回0,则它们是相同的

if (strcmp(response,"Dice")==0){
   ...
}

你做了
char*response
。这使得指针变量指向一个字符。现在它没有指向任何内存(它是一些垃圾值)
scanf
将用户输入存储在连续的内存地址中,从
response
指向的地址开始。由于
response
未初始化,因此输入不一定存储在堆栈上(不希望这样)

现在,当你做
response==“Dice”
时,它根本没有任何意义


关于数组和指针及其比较的一些基本知识

int arr[10];
现在,
arr
指向数组的第一个成员,
arr+1
指向第二个,
arr+2
指向第三个,依此类推
arr[i]
是表示
*(arr+i)
的简写方式


字符串也是一个字符数组

char *str1="Hello";
char *str2="Hello";
if(str1==str2){...}

第三行中的if语句所做的是,它与指针进行比较,即检查它们是否都指向同一位置。因为这不是真的,所以执行不会进入if块。您要做的是逐字符比较字符串。
string.h
中有一个内置函数,名为
strcmp()
,它可以实现这一点

响应
未初始化。
scanf
有问题,但不限于…未分配的
响应
。与字符串文字进行比较。在c语言中不能使用
==
来比较字符串,实际上您没有字符串,您有指向图表的未初始化指针,这不是唯一的问题。您不能使用
==
运算符比较字符串。不要破坏您的问题或对其进行编辑,使答案没有上下文!你读过注释吗?没有认可代码的其余部分,但这是阻止它编译的问题。我不认为它阻止了编译。是的,它应该给我一大堆警告。奇怪的是它没有给我任何警告?而且我把应变帽放进去,我给了我非零状态,这里是我的代码#include#include#include int main(){char*response;int anger=0;int correct=0;printf(“type Dice”);scanf(%s),&response);int compare=strncp(response,“Dice”,20);if(compare==0)printf(“干得好!”);返回0;}有趣的是,最后一个示例实际上可以计算为
true
,因为
str1
str2
指向相等的字符串文本,编译器很可能决定不复制它们,并且只有一个
“您好“
已分配。您必须具有字符串文字比较警告。不要忽略编译器警告。他们在那里待了一段时间reason@EugeneSh. 不确定编译器是否会这样做,因为编译器希望在以后的代码中保留更改的范围。是的,它将:。顺便说一句,这些应该是指针(为您修复了它…)。编译器不关心将来的更改。在程序中,我们试图改变两个字符串中的任何一个。编译器可能会使
str1
str2
指向相同的位置,否则一个字符串中的更改将更改另一个字符串