无论输入如何,strcmp 始终为真
strcmp always true regardless of input
所以我目前正在学习 C 编程,为大学学期的开始做准备。有点像 "leg up" 的东西。无论如何,我正在做一些比较字符串和使用字符串复制函数将新值放入字符串数组的练习,但我遇到了一些我无法解释的意外行为。无论我输入什么,它总是显示字符串比较检查的肯定结果,而且我无法确定哪里出错了。如果有人愿意帮助我,我将不胜感激!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char tVar1[10];
char tVar2[10];
printf("Enter your first test variable: \n");
scanf("%c", &tVar1);
strcpy(tVar2, "yes");
if(strcmp(tVar1, "yes") == 0)
{
printf("It would probably be more effective if you used two different variables.");
}
else
{
printf("Nope, just the same amount of effectiveness.");
}
return 0;
}
要接收一个 字符串,更改
scanf("%c", &tVar1);
至
scanf("%9s", tVar1);
当您在 scanf 中使用 %c 时,它只会读取一个字符。要阅读一个单词(文本直到白色 space),请使用 %s:
scanf("%9s", tVar1);
9 限制读取的字符数,以避免常见的黄油溢出漏洞。
如果你想阅读整个输入行(不仅仅是一个词):
#define MAXLINE 9
char line[MAXLINE + 1];
fgets(line, MAXLINE, stdin);
请注意 fgets 添加了一个尾随换行符,因此您需要用空字节覆盖它。
fgets
也比带有换行符的 scanf, because scanf
leaves stdin 更好,这将导致下一个输入调用被“跳过”。
%c
用于读取单个字符值,而不是 字符串 。当您在终端上输入字符串时,只会读取第一个字符并将其分配给 tVar1[0]
。要从输入流中读取一个字符串,需要使用%s
转换说明符:
scanf( "%9s", tVar1 ); // note no & on tVar1
tVar1
的大小可容纳 10 个元素,这意味着我们最多可以将 9 个字符读入缓冲区(必须为字符串终止符保留一个元素)。 9
is %9s
阻止我们将更多的字符读入缓冲区。
遗憾的是,大小必须作为转换说明符的一部分进行硬编码。无法将大小作为 运行 时间参数提供(就像 printf
那样)。有很多方法可以解决这个问题 - 例如,您可以在 运行 时间动态构建格式字符串 - 但不管怎样都会很痛苦。
请注意,我们在 scanf
调用中没有为 tVar1
使用 &
。大多数情况下,"N-element array of T
"类型的表达式会被转换为"pointer to T
"类型的表达式,表达式的值就是第一个元素的地址。
所以我目前正在学习 C 编程,为大学学期的开始做准备。有点像 "leg up" 的东西。无论如何,我正在做一些比较字符串和使用字符串复制函数将新值放入字符串数组的练习,但我遇到了一些我无法解释的意外行为。无论我输入什么,它总是显示字符串比较检查的肯定结果,而且我无法确定哪里出错了。如果有人愿意帮助我,我将不胜感激!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char tVar1[10];
char tVar2[10];
printf("Enter your first test variable: \n");
scanf("%c", &tVar1);
strcpy(tVar2, "yes");
if(strcmp(tVar1, "yes") == 0)
{
printf("It would probably be more effective if you used two different variables.");
}
else
{
printf("Nope, just the same amount of effectiveness.");
}
return 0;
}
要接收一个 字符串,更改
scanf("%c", &tVar1);
至
scanf("%9s", tVar1);
当您在 scanf 中使用 %c 时,它只会读取一个字符。要阅读一个单词(文本直到白色 space),请使用 %s:
scanf("%9s", tVar1);
9 限制读取的字符数,以避免常见的黄油溢出漏洞。
如果你想阅读整个输入行(不仅仅是一个词):
#define MAXLINE 9
char line[MAXLINE + 1];
fgets(line, MAXLINE, stdin);
请注意 fgets 添加了一个尾随换行符,因此您需要用空字节覆盖它。
fgets
也比带有换行符的 scanf, because scanf
leaves stdin 更好,这将导致下一个输入调用被“跳过”。
%c
用于读取单个字符值,而不是 字符串 。当您在终端上输入字符串时,只会读取第一个字符并将其分配给 tVar1[0]
。要从输入流中读取一个字符串,需要使用%s
转换说明符:
scanf( "%9s", tVar1 ); // note no & on tVar1
tVar1
的大小可容纳 10 个元素,这意味着我们最多可以将 9 个字符读入缓冲区(必须为字符串终止符保留一个元素)。 9
is %9s
阻止我们将更多的字符读入缓冲区。
遗憾的是,大小必须作为转换说明符的一部分进行硬编码。无法将大小作为 运行 时间参数提供(就像 printf
那样)。有很多方法可以解决这个问题 - 例如,您可以在 运行 时间动态构建格式字符串 - 但不管怎样都会很痛苦。
请注意,我们在 scanf
调用中没有为 tVar1
使用 &
。大多数情况下,"N-element array of T
"类型的表达式会被转换为"pointer to T
"类型的表达式,表达式的值就是第一个元素的地址。