strcmp() 没有 return 它应该 return
strcmp() not returning what it should return
基本上我想创建一个程序,其中包含我即将进行的数字系统考试中可能会出现的潜在问题。
#include <stdio.h>
#include <string.h>
int main() {
char input1[600];
printf("What is the set of available registers?");
scanf("%s", &input1);
if(strcmp(input1, "registers, memory, hard disc") == 0){
printf("Good job! You got it right");
}
else {
printf("Wrong answer!");
}
所以每当我输入 "registers, memory, hard disc" 当我被问到 returns 1 而不是 0 时。我看不出问题所在。我是 C 的新手,如果这是一个愚蠢的问题,我很抱歉。
如评论中所述,scanf()
和 "%s"
在第一个空白字符处停止转换。要阅读整行文本,请使用 fgets()
:
#include <stddef.h>
#include <stdio.h>
#include <string.h>
// ...
char foo[100];
if(!fgets(foo, sizeof(foo), stdin)) // don't use sizeof on pointers
; // handle error // for that purpose!
size_t length = strlen(foo);
if(length && foo[length - 1] == '\n') // fgets also reads the newline character
foo[--length] = '[=10=]'; // at the end of the line, this removes it.
尝试更改您的 scanf 行:
scanf("%s", &input1);
至:
scanf("%[^\n]", input1);
它对我有用。
剑鱼已经给出了很好的答案,fgets
比scanf
更可取。但是,我想展示在这种情况下您将如何使用 scanf
:
if(scanf("%599[^\n]", input1) != 1) {
// Handle error
}
那么有什么不同呢?
scanf
returns成功赋值的次数,所以如果这个returns1,那么input1
已经赋值了。如果不是,则发生错误。
- 已将
s
更改为 [^\n]
以读取到换行符
- 已插入
599
(600个以内)所以保证不写到数组外
- 已从
input1
中删除 &
。在这种情况下,它可能无论如何都会起作用,但这是未定义的行为,应该不惜一切代价避免。
基本上我想创建一个程序,其中包含我即将进行的数字系统考试中可能会出现的潜在问题。
#include <stdio.h>
#include <string.h>
int main() {
char input1[600];
printf("What is the set of available registers?");
scanf("%s", &input1);
if(strcmp(input1, "registers, memory, hard disc") == 0){
printf("Good job! You got it right");
}
else {
printf("Wrong answer!");
}
所以每当我输入 "registers, memory, hard disc" 当我被问到 returns 1 而不是 0 时。我看不出问题所在。我是 C 的新手,如果这是一个愚蠢的问题,我很抱歉。
如评论中所述,scanf()
和 "%s"
在第一个空白字符处停止转换。要阅读整行文本,请使用 fgets()
:
#include <stddef.h>
#include <stdio.h>
#include <string.h>
// ...
char foo[100];
if(!fgets(foo, sizeof(foo), stdin)) // don't use sizeof on pointers
; // handle error // for that purpose!
size_t length = strlen(foo);
if(length && foo[length - 1] == '\n') // fgets also reads the newline character
foo[--length] = '[=10=]'; // at the end of the line, this removes it.
尝试更改您的 scanf 行:
scanf("%s", &input1);
至:
scanf("%[^\n]", input1);
它对我有用。
剑鱼已经给出了很好的答案,fgets
比scanf
更可取。但是,我想展示在这种情况下您将如何使用 scanf
:
if(scanf("%599[^\n]", input1) != 1) {
// Handle error
}
那么有什么不同呢?
scanf
returns成功赋值的次数,所以如果这个returns1,那么input1
已经赋值了。如果不是,则发生错误。- 已将
s
更改为[^\n]
以读取到换行符 - 已插入
599
(600个以内)所以保证不写到数组外 - 已从
input1
中删除&
。在这种情况下,它可能无论如何都会起作用,但这是未定义的行为,应该不惜一切代价避免。