【发布时间】:2020-06-24 08:26:04
【问题描述】:
我目前正在学习 C,今天遇到了这个问题。我被要求设计一个函数,它从一行中读取第一个单词并丢弃其余单词,同时指定要读取的最大字符数。下面是我的!非常感谢你们!
#include<stdio.h>
#include<ctype.h>
void get_vol(char * input, int num);
int main(void)
{
char input[256];
int num;
//char ch;
printf("How many?\n");
scanf("%d", &num);
//while((ch = getchar()) != '\n')
// continue;
get_vol(input, num);
if (num > 0)
printf("The word you entered is %s\n", input);
return 0;
}
void get_vol(char * input, int num)
{
char ch = 0;
int i;
if(num > 0)
{
printf("Please enter here:\n");
do
ch = getchar();
while(isblank(ch));
for(i = 0; !isblank(ch) && i < num; ++i)
{
input[i] = ch;
ch = getchar();
}
input[i] = '\0';
}
else
printf("You cannot have less than 1 characters to proceed!\n");
}
所以在这里我遇到了两个问题。 1)似乎我的 get_vol 函数在扫描数字后无法立即删除 '\n' ,除非我故意将这三行留在 cmets 中。所以我猜 getchar() 不能直接跳到下一行,对吧?因为我认为 get_vol() 中的 do...while 循环足以丢弃我的第一个单词之前的任何内容(甚至是新行)。 2)说,我最多有 5 个字符要读取,我输入了三个字符,但是在我的程序中,我需要在输出显示之前再按三次返回键,所以我猜 isblank() 不包括'\n'。我已经在 Xcode 11.5 中验证了这一点。有趣的是,根据C Primer Plus 6th,'\n' 应该包含在 5th 中,'\n' 不在列表中。
【问题讨论】:
-
我建议你find a simpler problem。这意味着您将复杂的任务分解为更小更简单的子任务。这样做直到每个子任务不能进一步划分。然后一个一个地执行每个小子任务,在进行下一个之前对其进行测试。
-
int ch = 0;,而不是char。它可能看起来好像它也适用于char,但它没有。 -
@AnttiHaapala 嗨,Antti,我明白你的意思了。但是由于我想使用 char 类型来获取字符,所以您建议我如何初始化 ch?
-
暗示@AnttiHaapala 的问题是
getchar实际上返回int。如果您想将结果与int值EOF(您确实应该这样做)进行比较,这一点非常重要。不要担心它是int,C 中的字符几乎总是被提升为int(这就是与EOF的比较会有问题的原因)。 -
@Someprogrammerdude 不仅如此,如果
charisblank中的扩展字符可能会崩溃