【问题标题】:Using scanf for char array in while loop在while循环中使用scanf for char数组
【发布时间】:2015-11-16 16:24:12
【问题描述】:

我是 C 编程新手。 我很好奇我学到了多少 C. 因此,我想创建一个程序,在其中我可以简单地创建一个文件并在其中写入。 我想,文件名应该少于 100 个字符。但不管是字符串还是一个单词还是一个字母。 我无法完成,因为我被困在如何输入文件名的字符串(例如,Project work、New Doc1 等)的事实上

所以我写了这个;

int main()
{

    int a = 0;

    while(a != 5)
    {
        puts("Put a number: ");
        scanf("%i", &a);
        if(a == 1)
        {
            char name[30];
            printf("Put a name: ->>");
            for(int i = 0;i < 31 && name[i] != '\n';i++)
            {
                name[i] = getchar();

            }
            char ex[50] = ".txt";

            strcat(name,ex);
            printf("%s",name);

        }
    }

    return 0;
}

问题是在输入名称时,它不会在下一个停止(当我按下回车键时),而且它也没有打印正确的文件名。

【问题讨论】:

  • 在将换行符写入name[i] 后增加 i,因此条件不会检查您想要的值。
  • 这是一个非常常见的问题——将scanf() 与其他 I/O 原语混合。 'number' 输入在输入缓冲区中留下一个换行符,因此在for 循环中读取的第一个字符是一个换行符。在您输入任何内容之前,您还将name[0] 与换行符进行比较——这是个坏主意(未定义的行为)。下一次循环时,您将再次尝试将未初始化的字符与换行符进行比较;仍然不是幸福的秘诀。此外,您的数组大小为 30,但您正在针对 31 进行测试;最终会遇到更多麻烦,但您需要先解决其他问题。
  • 所以您必须使用getchar() 来实现您的教育目标?使用if (scanf("%25s", name) != 1) break; 会简单得多。您最多需要允许 25 个用户输入的字符,因为您要附加 .txt 并且还需要一个空终止符(因此必须在字符串中保留 5 个位置)。
  • @cdonts 在需要时声明变量。
  • @chux 我会考虑到这一点。感谢您的提示

标签: c


【解决方案1】:

你的方法有很多问题。

  1. 将 scanf 与其他输入原语混合是不好的,您必须从任何剩余的字符中清除 stdin。
  2. 任何字符串都必须以 '\0' 结尾才能将该字符串标记为完整。所以你必须为这个角色预留空间。
  3. 连接时必须遵守字符串的限制。
  4. 如果你使用 printf,字符串只会在刷新标准输出后显示(当你在字符串末尾加上 '\n' 时,刷新完成)

试试这个:

#include <stdio.h>
#include <string.h>   

int main()
{

    int a = 0;

    while(a != 5)
    {
        int ch;
        puts("Put a number: ");
        scanf("%d", &a);
        /* flush any remaining characters */
        while ((ch=getchar()) != EOF && ch != '\n'); /* issue 1 */
        if(a == 1)
        {
            int i = 0;
            char name[30];
            printf("Put a name: ->>");
            fflush(stdout); /* issue 4 */

            while ((ch=getchar()) != EOF && ch != '\n' && i < 25) /* issue 3 */
                name[i++] = ch;
            name[i] = '\0'; /* issue 2 */

            /* flush any remaining characters [if input > 25 chars] */
            if (ch != EOF && ch != '\n') while ((ch=getchar()) != EOF && ch != '\n');

            char ex[50] = ".txt";

            strcat(name,ex); /* issue 3 */
            printf("%s\n",name);

        }
    }

    return 0;
}

另外,考虑使用getlineatoi 而不是getcharscanf

【讨论】:

  • 综合答案的微妙细节:“任何字符串都必须以 '\0' 结尾”。根据定义,字符串always 以'\0' 结尾。 IOW 使 字符数组 成为字符串,它必须包含一个 '\0'。
  • 通过 fflush(stdin) 刷新缓冲区调用未定义的行为
  • @kapil fflush(stdin) 在哪里?
  • @chux 只是说不要使用它
【解决方案2】:
#include<stdio.h>
main()
{
    static char stop_char='y';
    char input=0;
    do{
        printf("please input a character\n");
        scanf("\n%c",&input);
    }while(input!=stop_char);
}

【讨论】:

  • 如果您不介意在任何文件名中使用字符 y,那就太好了。
猜你喜欢
  • 2013-11-23
  • 1970-01-01
  • 1970-01-01
  • 2015-11-26
  • 1970-01-01
  • 2016-11-19
  • 2021-02-04
  • 2016-01-15
  • 2023-03-07
相关资源
最近更新 更多