我已经制作了这个结构,但是我已经陷入了必须执行if / else编码的最后一点。这是我的第一个程序,在网上使用了一些教程。
代码如下:
$('.tb-two').hide(); //if tabtwo is empty
$('.tb-hree').hide(); //if tabthree is empty
and so on...
答案 0 :(得分:1)
您正在从控制台读取字符串。如果我理解,一个简单的方法是只检查字符串中的第一个字符。你可以这样做:
if ( (pbprint[0] == 'Y') || (pbprint[0] == 'y') )
{
printf("your printing is done");
}
else
{
printf("your printing is not done");
}
用户通常非常有创意,因此您可以选择输入界面的智能和多功能性。
答案 1 :(得分:1)
首先将变量声明从char
更改为char array
,因为您希望输入字符串。我正在考虑最大值你将在字符串中输入19个字符,所以变量声明将如下所示:
char fName[20];
char mName[20];
char lName[20];
char pbprint; // This is just character as you want single character input
您可以更改您的服用字符输入,如下所示:
printf("\n\n\nWould You Like Us To Print Your Passbook [Y/N] : ");
scanf(" %c",&pbprint); // Notice whitespace in the format string
if((pbprint == 'Y') || (pbprint == 'y')) // now you can do single character comparison
{
printf("Yes");
}
else
{
printf("No");
}
我希望这可以帮助你进行单字符输入
答案 2 :(得分:1)
问题#1:您需要留出空间来存储字符串数据。 char
数据类型仅为单个字符值('A'
,{{1}分配空间等等)。 字符串是'j'
值的序列,后跟一个0值字节,因此您需要将char
的数组放在一边足以容纳一个名称加上0终止符。
因此,您的名称变量需要声明为char
的数组:
char
要使用#define NAME_LEN 30 // make this as big as you need
char fName[NAME_LEN + 1]; // Add a space for the 0 terminator
char mName[NAME_LEN + 1];
char lName[NAME_LEN + 1];
阅读这些内容,您需要编写
scanf
scanf( "%s", fName ); // note no & operator
转换说明符期望其对应的参数是指向%s
数组的第一个元素的指针。在大多数情况下,数组表达式(例如上面调用中的char
)将自动转换为指针,因此您不需要使用{{1}在这种情况下运算符。
为安全起见,您应该检查fname
电话的结果;它将返回成功转换和分配的数量(如果没有转换成功,则返回0),如果它看到文件结束或错误情况,则返回&
。您还应指定转换说明符中要读取的最大字符数;否则,如果您键入的字符数超过目标数组的大小以容纳,scanf
将很乐意尝试将这些额外字符存储在数组末尾的内存中,从而导致从损坏的数据到碎片堆栈的任何内容彻底崩溃:
EOF
不幸的是,长度必须是"硬编码"进入转换说明符。您可以使用一些不太直观的预处理器宏来解决这个问题:
scanf
然后你可以写点像
if ( scanf( "%30s", fName ) == 1 ) // expect one successful conversion and assignment
{
// successfully read fName
}
else
{
// problem during read
}
将扩展到
#define S2(x) #x // surrounds x with double quotes
#define S1(x) S2(x) // causes x to be expanded before being passed to S2
#define E1(x) x // causes x to be expanded
#define FMT(x) S1(%E1(x)s) // writes a %xs conversion specifier, where
// x is the max length
if ( scanf( FMT(NAME_LEN), &fName ) == 1 )
和if ( scanf( "%30s", &fName ) == 1 )
宏看起来多余,但它们是必要的;你想"扩展"在将S2
运算符应用于它之前的参数E1
。如果我们写了
x
它会扩展到
#
这不是我们想要的。
问题#2:简单地声明指针不会为你指向的东西留出存储空间。声明
#define S1(x) #x
#define FMT(x) S1(%xs)
...
if ( scanf( FMT(NAME_LEN), &fName ) == 1 )
创建指针变量if ( scanf( "%xs", &fName ) == 1 )
,但它没有为我们想要指向的东西分配任何内存。在此特定情况下,如果您要存储的所有内容均为char * pbprint;
或pbprint
值,则将y
声明为常规n
并使用pbprint
进行阅读转换说明符,如下所示:
char
需要%c
转换说明符之前的前导空格来跳过输入流中的任何前导空格;否则,您冒险从前一个条目中获取换行符,这不是您想要的。
我们还使用#include <ctype.h>
...
char pbprint;
...
if ( scanf( " %c", &pbprint ) == 1 ) // note leading blank in format string
{
if ( tolower( pbprint ) == 'y' ) // convert to lower case for comparison
{
// show print output
}
else
{
// don't show print output
}
}
else
{
// error on input
}
库函数(在%c
中声明)将输入字符转换为小写以进行比较。这样我们就不必为小写和大写字母编写不同的分支。