在C中,一次保存一个字符

时间:2011-09-29 05:21:02

标签: c cstring

我正在处理一个字符串,其中每个单词用空格分隔。 <表示它是输入重定向,并且>表示它是输出重定向。 例如:

< Hello > World

我想将单词保存在不同的变量中(char * in,char * out) 我怎样才能做到这一点?我查看了字符串库,似乎没有人能够完成这项工作。

这是我到目前为止关于这个问题的内容。

char buff[MAXARGS];
char *str;
char *in;
char *out;

if( strchr(buff, '<') != NULL )
{
  str = strchr(buff, '<');
  str++;
  if( *str == ' ' || *str == '\0' || *str == '\n'  || *str == '\t' )
  {
     fprintf( stdout, "User did not specify file name!\n" );
  }
  else
      in =  str; // This will save Hello > World all together. I don't want that. 
}

非常感谢。

4 个答案:

答案 0 :(得分:0)

你可以用这个..

char filename[max_path]
 str1 = strchr(buff, '<');
 str2 = strchr(buff, '>');

 memcpy( filename , str1+1 , str2-str1-1 ); 

所以&lt;和&gt;将是文件名。

 output = str2 + 1;

答案 1 :(得分:0)

假设您的输入模式已修复为< input_name > output_name,并且您希望能够分别提取input_nameoutput_name

一种解决方案是使用“&lt;&gt;”拆分str。以下代码将连续打印出Hello,World。将它们保存到inout留给您作为练习:)

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

int main ()
{
  char str[] ="< Hello > World";
  char *in;
  char *out;
  char *pch;
  char *del=" <>";
  pch = strtok (str,del);
  while (pch != NULL)
  {
    printf ("%s\n",pch);
    pch = strtok (NULL, del);
  }
  return 0;
}

答案 2 :(得分:0)

为了帮助您入门,假设您可以修改buff并假设一个简单的案例(最多一个<且最多一个>),您可以采用以下方式

首先,获取<>

的位置
in  = strchr(buff, '<');
out = strchr(buff, '>');

然后你人为地拆分字符串:

if (in) {
  *in = 0;
  in++;
}
if (out) {
  *out = 0;
  out++;
}

此时,buff指向没有<>的以C结尾的字符串。 in可以是null,也可以指向<后面的字符串,但不包含>。与out相同。

然后你需要“删除”所有这些字符串(删除空格),然后检查它们是否仍包含有意义的数据。

你需要更多的逻辑才能使所有情况正确,包括拒绝无效输入。

答案 3 :(得分:0)

您需要确定分配两个文件名的存储位置,以及如何知道提供的存储空间。

static void find_filename(const char *str, char *name)
{
    char c;
    while ((c = *str++) != '\0' && isspace((unsigned char)c))
        ;
    if (c != '\0')
    {
        *name++ = c;
        while ((c = *str++) != '\0' && !isspace((unsigned char)c))
            *name++ = c;
    }
}

int find_io_redirection(const char *str, char *in, char *out)
{
    const char *lt = strchr(str, '<');
    const char *gt = strchr(str, '>');
    if (lt != 0)
        find_filename(lt+1, in);
    if (gt != 0)
        find_filename(gt+1, out);
    return(lt != 0 && gt != 0);
}

此代码假设您为inout提供足够大的字符串。如果你想更安全,那么你告诉函数每个目标字符串有多大。您可以压缩该代码。您可能决定要返回重定向的数量。您可能决定应该了解双输出重定向或双输入重定向。您可能决定应该返回一个位掩码,指示存在哪些重定向。使用相当复杂的接口,您可以指示输入行的哪些部分表示I / O重定向;这将有助于调用函数决定现在应该忽略该行的哪些部分。

您可以像上面这样使用上面的代码:

char buffer[MAXCMDLEN];
char in[MAXFILENAMELEN];
char out[MAXFILENAMELEN];

if (fgets(buffer, sizeof(buffer), stdin) != 0)
{
    if (find_io_redirection(buffer, in, out))
        ...process buffer know that I/O redirection is present...
    else
        ...witter about missing I/O redirection...
}