如何读取字符串然后在C中格式化?

时间:2010-02-10 15:23:20

标签: c unix stdout stdin

我如何从stdin读取字符串并将其格式化为stdout?

例如: 如果我收到某人的名字: John Doe 03 17

我想为他创建用户名: jd0317

虽然可以更改为具有中间名的人: Jane B. Doe 05 18

那就是: jbd0518

我假设您会读取该行,然后当您到达某个空间时,您会将该部分名称存储在一个数组中并切掉其余部分,而这些部分是您不需要的。我会继续阅读,直到从stdin读取CTRL ^ D,这将代表EOF。

我会在循环或getchar中使用scanf吗?

5 个答案:

答案 0 :(得分:2)

我会使用'fgets()'来获取一行,然后处理它以产生名称:

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

int main(void)
{
    char line[512];
    if (fgets(line, sizeof(line), stdin) != 0)
    {
        char  name[16];
        char *dst = name;
        char *end = name + sizeof(name) - 1;
        char *src = line;
        while (*src != '\0')
        {
           char  c;
           while ((c = *src++) != '\0' && isspace(c))
               ;
           if (isalpha(c))
           {
               if (dst < end)
                   *dst++ = tolower(c);
               while ((c = *src++) != '\0' && !isspace(c))
                   ;
           }
           else if (isdigit(c))
           {
               while (dst < end && isdigit(c))
               {
                    *dst++ = c;
                    c = *src++;
               }
           }
        }
        *src = '\0';
        puts(name);
    }
    return 0;
}

鉴于输入'John Doe 03 17'输出'jd0317';给出输入“Jane B. Doe 05 18”生成“jbd0518”。

答案 1 :(得分:0)

要在循环中读取正在使用的数据fgets()和stdin或getchar(),或者查看你的库是否有getline()。

然后你可以用strtok()拆分结果字符串,或者如果它看起来太复杂(乍一看),你可以在用getchar()读取它时自己分割输入 - 只需检测空格并复制自己的价值观。

答案 2 :(得分:0)

您可以在循环中使用fgets,直到返回NULL(如果达到EOF,则会发生这种情况)。
使用它,您可以从输入读取完整的一行到字符数组。

接下来,您可以解析查找空格的行,每次看到空格时,查看上一个块是否为非数字,如果是,则将其第一个字符复制到结果中。如果是数字,则将其数字复制到结果中,方法是将它们设为char。

答案 3 :(得分:0)

您可以在循环中使用getchar并使用EOF或换行符作为循环终止条件。一旦你读到一个角色进入一个数组并忽略其他角色直到一个空格,然后将该角色存储在数组中的空格旁边并重复忽略的角色,直到你到达下一个空格。

但是,您需要处理数字,因为您似乎希望按原样存储所有数字。为此,您可以将输入的字符与1到9之间的数字的ASCII值进行比较,以查看它是字母还是数字并存储所有数字。您可能只想在空格后面输入的字符是数字时才这样做,因为您的问题似乎暗示了这一要求。

此外,您可能需要根据功能需求进行一些错误检查。请不要忘记检查存储它的数组中的数组边界。

这只是我的基本建议。希望这会有所帮助。

答案 4 :(得分:0)

要读取整行,包括空格,您可以在循环中使用fgets,直到遇到EOF。然后,您可以使用sscanfstrtok来获取每行的各个空格分隔元素。

如果您已经知道每行包含多少令牌及其类型,那么

sscanf通常是最佳选择。 strtok使您可以从一行获取所有令牌,即使您不知道它有多少令牌。