我想在' \ n'中打破存储在数组中的字符串。字符?

时间:2017-10-30 15:37:16

标签: c string fgets

我的文件包含三行,在使用fgets将文件读入数组后,我想打破新行字符的三行并在控制台上单独打印三行,如果可能的话,将三行放入三个不同的阵列。

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

 int main()
 {
    FILE *infile;
    char data[BUFSIZ],*pa,token_seperator[]={"\n"};

   infile=fopen("example","r");

   while((fgets(data,BUFSIZ,infile)!=NULL))

   pa=strtok(data,token_seperator);

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

3 个答案:

答案 0 :(得分:1)

没有任何意义“打破新行字符的三行”,因为一行只能包含一行新行。

如果需要读取单独数组中的每一行,则只需声明一个二维字符数组。如果需要,可以通过调用fgets删除附加到每一行的换行符。

所以该程序可以采用以下方式。

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

#define N 3

int main( void )
{
    FILE *infile;
    char data[N][BUFSIZ];

    infile = fopen( "example", "r" );

    if ( infile )
    {
        size_t n = 0;
        for (; n < N && fgets(data[n], BUFSIZ, infile); n++)
        {
            data[n][strcspn(data[n], "\n")] = '\0';
        }

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

    return 0;
}

答案 1 :(得分:0)

你需要分配一些内存才能做到这一点,只是因为你不知道你最终会有多少行,也不知道每行的大小。

我建议您使用下一个代码

DispatcherTimer _timer;
bool cancelled;

async void Click()
{
    if (_timer != null)
    {
        _timer.Stop();
        _timer.Dispose();
    }

    ErrorPanel.Visibility = Visibility.Visible;

    _timer = new DispatcherTimer();
    _timer.Interval = TimeSpan.FromSeconds(10);
    _timer.Tick += _timer_Tick;
    _timer.Start();

    var products = await Task.Run(() => Communication.GetProductList(tempPznList));
    _timer.Stop();
    if (!cancelled)
    {
        mainPznItem.SubPzns = products;
        ErrorPanel.Visibility = Visibility.Hidden;
    }
}

private void _timer_Tick(object sender, EventArgs e)
{
    MessageBox.Show("error...");

    _timer.Tick -= _timer_Tick;
    _timer.Stop();
    cancelled = true;
    ErrorPanel.Visibility = Visibility.Hidden;
}

答案 2 :(得分:0)

下面的函数truncCrLf从ASCII-0字符串中删除CR和/或LF代码的第一次出现。这就是您要查找的内容,因为fgets函数从文件中读取这些ASCII代码(0xA和/或0xD)。

此功能在Linux和Windows SO下运行。

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

char * truncCrLf(char *data)
{
    char *app=NULL;

    app = strchr(data, '\n');
    if (app)
      *app=0;

    app = strchr(data, '\r');
    if (app)
      *app=0;

    return data;
}

int main(void)
{
  char test[200];

  strcpy(test,"Hello world\n");

  printf("%s......\n",test);

  truncCrLf(test);

  printf("%s......\n",test);

  return 0;
}