【问题标题】:Writing a letter using scanf in C在 C 中使用 scanf 写一封信
【发布时间】:2019-12-18 16:11:01
【问题描述】:

我得到了这个练习:

想象一下,有人想写一封信。使用单个 scanf 命令执行输入每个句子。每个句子都存储在一个字符数组中 最佳长度。如果用户输入的行仅由破折号 (-) 组成,则文本为 假设完成。输入所有文本后,将其打印到 控制台。

我不太明白这意味着什么,但我决定尝试使用 scanf 写一封电子邮件

#include <stdio.h>         
int main()        
{          

char name1[100];       
char mail1[9999];     
char name2[100];        
printf("Dear ");      
scanf("%s", name1);     
scanf("%s", mail1);      
printf("Sincerely,");         
scanf("%s", name2);       


return 0;      
}

这是我能写的。我写了一个人的名字后写了“亲爱的”,我只写信的正文,但是如果我写了一个以上的字,我就不能在真诚的后面写任何东西

【问题讨论】:

  • %s 格式说明符读取空格分隔的单词
  • 你应该使用fgets
  • 请不要通过破坏您的帖子为他人增加工作量。通过在 Stack Exchange 网络上发帖,您已在 CC BY-SA license 下授予 Stack Exchange 分发该内容的不可撤销的权利(即无论您未来的选择如何)。根据 Stack Exchange 政策,帖子的非破坏版本是分发的版本。因此,任何破坏行为都将被撤销。如果您想了解更多关于删除帖子的信息,请参阅:How does deleting work?

标签: c scanf


【解决方案1】:

您的第三个scanf 已跳过,因为您在第二个scanf 之间放置了空格。为避免这种情况,请使用 get() 方法而不是 scanf()

#include <stdio.h>

int main()
{
    char name1[100];       
    char mail1[9999];     
    char name2[100]; 

    printf("Dear "); 

    gets(name1);
    gets(mail1);

    printf("Sincerely, "); 

    gets(name2);

    return 0;   
}

但是如果您只想使用 scanf() 来尝试此操作,请遵循此代码。

#include <stdio.h>

int main()
{
    char name1[100];       
    char mail1[9999];     
    char name2[100]; 

    printf("Dear ");

    scanf("%[^\n]%*c", name1);
    scanf("%[^\n]%*c", mail1);

    printf("Sincerely, "); 

    scanf("%[^\n]%*c", name2);

    return 0;   
}

两个代码的输出 -:

Dear Son                                                                                                            
I love you                                                                                                          
Sincerely, Your Mom

【讨论】:

  • 哦,谢谢,我尝试使用 fgets,但它完全跳过了它,顺便说一下,我能对破折号做些什么吗?
  • 什么破折号?你能进一步解释一下吗?
  • 所以输入破折号(-)应该是句子的结尾,根据我认为的练习,一个句子应该是一个scanf。
  • 是的。如果你想写类似的段落,你可以使用另外几个字符数组。
  • 你能解释一下破折​​号是如何结束一个句子的吗?我尝试使用 if 语句和循环,但无法正确
【解决方案2】:

您的程序应该执行以下操作:

while (1)
{
    scnaf into a fixed length buffer;
    if the buffer equals to "-"
        break the loop;
    duplicate the buffer;
    add the duplicate to any structure (like a linked list);
}

run over the list and print all the lines.

关于scanf,一个简单的调用是行不通的,因为它只读取一个单词。使用fgets 或更宽松的扫描格式说明符。谷歌搜索我发现了这个选项:

scanf("%[^\n]", str);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-25
    • 2014-04-29
    • 2014-12-28
    • 1970-01-01
    • 2020-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多