我正在处理一个字符串,其中每个单词用空格分隔。 <表示它是输入重定向,并且>表示它是输出重定向。 例如:
< 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.
}
非常感谢。
答案 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_name
和output_name
。
一种解决方案是使用“&lt;&gt;”拆分str。以下代码将连续打印出Hello,World。将它们保存到in
和out
留给您作为练习:)
#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);
}
此代码假设您为in
和out
提供足够大的字符串。如果你想更安全,那么你告诉函数每个目标字符串有多大。您可以压缩该代码。您可能决定要返回重定向的数量。您可能决定应该了解双输出重定向或双输入重定向。您可能决定应该返回一个位掩码,指示存在哪些重定向。使用相当复杂的接口,您可以指示输入行的哪些部分表示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...
}