所以我目前正在学习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;
}
答案 0 :(得分:5)
%c
用于读取单个字符值,而不是字符串。在终端上键入字符串时,只会读取第一个字符并将其分配给tVar1[0]
。要从输入流中读取字符串,您需要使用%s
转换说明符:
scanf( "%9s", tVar1 ); // note no & on tVar1
tVar1
的大小可以容纳10个元素,这意味着我们最多可以将9个字符读入缓冲区(必须为字符串终止符保留一个元素)。 9
%9s
阻止我们将更多字符读入缓冲区而不是它可以容纳。
不幸的是,大小必须硬编码为转换说明符的一部分。没有办法将大小作为运行时参数提供(就像printf
一样)。有很多方法 - 例如,你可以在运行时动态地构建格式字符串 - 但无论如何它都很痛苦。
请注意,我们在&
电话中未tVar1
使用scanf
。在大多数情况下,T
&#34;的类型为&#34; N元素数组的表达式将转换为&#34;指向T
&#34;的类型的表达式,表达式的值将是第一个元素的地址。
答案 1 :(得分:2)
要获取字符串,请更改
scanf("%c", &tVar1);
到
scanf("%9s", tVar1);
答案 2 :(得分:1)
如果你想阅读整个输入行(不只是一个单词):
#define MAXLINE 9
char line[MAXLINE + 1];
fgets(line, MAXLINE, stdin);
请注意,fgets会添加一个尾随换行符,因此您需要使用空字节覆盖该换行符。
fgets
也优于scanf,因为scanf
会为stdin留下换行符,这会导致下一个输入调用被“跳过”#34;。 / p>
答案 3 :(得分:0)
在scanf中使用%c时,它只能读取一个字符。要读取单词(文本直到空格),请使用%s:
scanf("%9s", tVar1);
9限制了要读取的字符数,以避免常见的黄油溢出漏洞。