从C中的输入文件扫描直到达到某个字符(#)?

时间:2013-08-12 15:52:09

标签: c arrays loops input terminate

简单问题:

如果我在输入文件中有一行看起来像:

Hello#Great#Day#Today

如何单独扫描每个单词作为自己的数组,换句话说告诉C在到达#字符时停止扫描然后进入循环的下一次迭代以将下一个单词作为单独的数组扫描?

3 个答案:

答案 0 :(得分:2)

这假设您正在阅读stdin。绝对看看@Whoz kick start方法(非常类似于此)。


您要做的是创建一个动态数组,并使用stdin读取的每个字节填充它。然后,您需要创建一个字符指针数组,指向每个“单词”中的第一个字符,您可以在'#'字符(分隔符)之前将单词定义为每个字符。然后,您将遍历该字符数组,并使用每个单词中第一个字符的内存地址填充字符指针数组。

答案 1 :(得分:2)

使用strtok()按指定字符标记输入。

http://www.cplusplus.com/reference/cstring/strtok/

 char str[] ="- This, a sample string.";
 char * pch;
 printf ("Splitting string \"%s\" into tokens:\n",str);
 pch = strtok (str,"#");
  while (pch != NULL)
 {
 printf ("%s\n",pch);
 pch = strtok (NULL, "#");
}

答案 2 :(得分:0)

在两个阶段,我使用过这样的东西:

#include <ansi_c.h>

//tokenizing a string
int GetCount(char *in, char *delim, int *m);
int GetStrings(char *in, char *delim, int count, char **out);  


void main(void)
{
    int count, maxlen, i;
    char inpString[]={"Hello#Greatest#Day#Today"};
    char *resultBuf[10];

    //get a count of strings to store
    count = GetCount(inpString, "#", &maxlen);

    for(i=0;i<10;i++)
    {
        resultBuf[i] = calloc(maxlen+1, sizeof(char));  
    }

    //Store strings in arrays
    GetStrings(inpString, "#", count, resultBuf);

    for(i=0;i<count;i++)
    {
        printf("%s\n", resultBuf[i]);
        free(resultBuf[i];
    }             

}
     //Gets count of tokens (delimited strings)
int GetCount(char *in, char *delim, int *m)
{
    char *buf=0;
    char temp1[10]={0};
    char *inStr;
    int count = 0;
    int max = 0, keepMax = 0;
    if(in)
    {

        inStr = calloc(strlen(in)+1, sizeof(char));
        strcpy(inStr, in);
        if(strlen(inStr) > 1)
        {
            count = 0;
            buf = strtok(inStr, delim);
            while(buf)
            {
                strcpy(temp1, buf);
                max = strlen(temp1);
                (max > keepMax)?(keepMax = max):(keepMax == keepMax);
                count++;
                buf = strtok(NULL, delim);
            }
            *m = keepMax;
        }
        free(inStr);
    }
    return count;
}
     //Gets array of strings
int GetStrings(char *in, char *delim, int count, char **out)
{
    char *buf=0;
    char *inStr;
    int i = 0;
    if(in)
    {

        inStr = calloc(strlen(in)+1, sizeof(char));
        strcpy(inStr, in);
        if(strlen(inStr) > 1)
        {
            buf = strtok(inStr, delim);
            while(buf)
            {
                strcpy(out[i], buf);
                buf = strtok(NULL, delim);
                i++;
            }
        }
        free(inStr);
    }
    return 0;
}