c - 无论输入如何,strcmp 始终为真

标签 c codeblocks

所以我目前正在学习 C 编程,为大学学期的开始做准备。有点像“抬腿”的事情。无论如何,我正在做一些比较字符串和使用字符串复制函数将新值放入字符串数组的练习,但我遇到了一些我无法解释的意外行为。无论我输入什么,它总是显示字符串比较检查的肯定结果,而且我无法确定哪里出错了。如果有人愿意帮助我,我将不胜感激!

#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;
}

最佳答案

%c 用于读取单个字符值而不是字符串。当您在终端上输入字符串时,只会读取第一个字符并将其分配给 tVar1[0]。要从输入流中读取字符串,您需要使用%s 转换说明符:

scanf( "%9s", tVar1 ); // note no & on tVar1

tVar1 的大小可容纳 10 个元素,这意味着我们最多可以将 9 个字符读入缓冲区(必须为字符串终止符保留一个元素)。 9%9s 阻止我们将更多的字符读入缓冲区而不是它可以容纳的字符。

不幸的是,大小必须作为转换说明符的一部分进行硬编码。无法将大小作为运行时参数提供(就像 printf 那样)。有很多方法可以解决此问题 - 例如,您可以在运行时动态构建格式字符串 - 但无论如何都会很痛苦。

请注意,我们没有在 scanf 调用中为 tVar1 使用 &。在大多数情况下,“T 的 N 元数组”类型的表达式将被转换为“指向 T 的指针”类型的表达式,并且表达式的值将是第一个元素的地址。

关于c - 无论输入如何,strcmp 始终为真,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32082224/

相关文章:

c# - DllImport 和 char 编码(marshal)处理

c - 将 int 转换为 char 数组的函数,一些问题

c - 未定义对 `__time32` ncurses 的引用

c - 如何使用代码块 13.12(mingw) 在 c 中使用 delay() 函数?

vim - 是否可以在 Code::Blocks 中使用 vi 模式?

C++ SDL Code::blocks:在头文件中声明指向全局变量的指针,同时避免多重包含问题

c - 如何使用 scanf 来限制用户输入不大于数组的字符串?

c - typedef 枚举,在其中赋值

python - 在 Cython 和 NumPy 中包装 C 函数

c++ - 以数学方式将 float 四舍五入到小数点后 N 位