【问题标题】:In C, how to set the delimiter of scanf to anything that is not alphabetic?在 C 中,如何将 scanf 的分隔符设置为非字母的任何内容?
【发布时间】:2013-10-16 09:48:33
【问题描述】:

有没有办法将 scanf 的分隔符设置为非字母的任何内容?

我的意思是,假设我有一个来自标准输入的输入:abc123def。从技术上讲,它只是一个字符串,但我想将其视为由非字母(在本例中为 123)分隔的 2 个字符串。

我找到了一种设置自定义分隔符的方法,但在这里,它的范围很广(数字字符、特殊字符、空格、制表符……任何不在 A..Za..z 范围内的东西)。

作为一个例子,这是我想做的事情:

#include <stdio.h>

int main()
{

char str[100];

while (scanf("%s", str) == 1)
    {
    printf("%s\n", str);
    }

return(0);
}

以上代码仅使用空格作为分隔符(我认为)。但我希望它使用任何非字母字符作为分隔符。所以当输入是:

你好..你好

它将输出:
Hi
There
Hello

更新:好的,我找到了解决方案。它使用 strtok 函数来完成这项工作,但方式不同。代码如下所示:

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

int main()
{

int i, len;
char str[100], *word;

while (gets(str))
    {
    len = strlen(str);
    for (i=0; i < len; i++)     // Replacing anything non alphabetic with space
        {
        if ( !(((str[i] >= 'A') && (str[i] <= 'Z')) || ((str[i] >= 'a') && (str[i] <= 'z'))) )
            {
            str[i] = ' ';
            }
        }

    word = strtok(str, " ");
    while (word != NULL)
        {
        printf("%s\n", word);
        word = strtok(NULL, " ");
        }
    }

return(0);
}

它完成了这项工作,但我想知道我是否可以在从标准输入中获取字符串时直接完成它。

干杯。

【问题讨论】:

  • 您的意思是A..Za..zABab 的字符集并不是很“庞大”。
  • 在您的案例研究中,“Ä”或“ß”是特殊字符还是普通字母?
  • 愚蠢的错字......也许我需要再去上小学......是的A..Za..z正是我的意思:D
  • 嗯,不,那些字符不会出现在输入中。特殊字符是指句点、逗号、斜杠等。

标签: c regex range scanf delimiter


【解决方案1】:

您可以使用字符序列格式说明符:

char s1[128], s2[128];

if(sscanf("abc123def", "%127[A-Za-z]%*[0-9]%127[A-Za-z]", s1, s2) == 2)
{
  printf("got '%s' and '%s'\n", s1, s2);
}

【讨论】:

  • 我会选择%*[0-9],而不是%*d
  • @cnicutar 当然,为什么不呢。也许也可以使用%*[^A-Za-z]
  • 其实我不知道字符串中有多少个单词。所以我必须使用循环(参见我添加的示例)。这个解决方案会循环工作吗?如果是这样,你能举个例子吗?不过我是初学者,所以请放轻松 :D 谢谢。
  • 您可以在每次运行时使用%*[^A-Za-z]%127[A-Za-z] 循环执行此操作。第一部分将删除任何非字母的内容,第二部分将实际存储您想要的字符串。
  • 你能举一个while循环的例子吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-10
  • 1970-01-01
  • 2014-12-17
相关资源
最近更新 更多