首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无论输入如何,strcmp始终为true。

问无论输入如何,strcmp始终为true。
EN

Stack Overflow用户
提问于 2015-08-18 20:42:50
回答 4查看 471关注 0票数 1

因此,我目前正在学习C编程,为大学学期的开始做准备。有点像“向上爬”的东西。无论如何,我正在练习使用字符串复制函数比较字符串和在字符串数组中放置新值,但是我得到了一些我无法解释的意外行为。它总是显示字符串比较检查的正结果,无论我输入了什么,我也无法确定我哪里出错了。如果有人给我帮助,我会非常感激的!

代码语言:javascript
复制
#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;
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-08-18 20:55:59

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

代码语言:javascript
复制
scanf( "%9s", tVar1 ); // note no & on tVar1

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

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

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

票数 5
EN

Stack Overflow用户

发布于 2015-08-18 20:45:02

若要获取字符串,请更改

代码语言:javascript
复制
scanf("%c", &tVar1);

至

代码语言:javascript
复制
scanf("%9s", tVar1);
票数 2
EN

Stack Overflow用户

发布于 2015-08-18 20:49:49

如果您想要阅读整个输入行(而不仅仅是一个单词):

代码语言:javascript
复制
#define MAXLINE 9
char line[MAXLINE + 1];
fgets(line, MAXLINE, stdin);

注意,飞碟添加了一个尾换行符,所以您需要用空字节覆盖它。

fgets也比扫描好,因为scanf给史丁留了一个换行符,这将导致下一个输入调用被跳过“。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32082224

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档