如何阅读不同长度的子串

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何阅读不同长度的子串相关的知识,希望对你有一定的参考价值。

我有一个文件有三列(来自传感器的读数),长度不同,例如。

-728 -233 3947
4258 -623 333 
-500 93 -4141 
-491 107 -4136 
-495 94 -4161 
-886 101 -4148 
-2555 1864 -4888 

我用fgets来读取这一行。但我想把第一列读作x,第二列读作y,第三列读作z。即使我使用空格作为检测新子字符串的标记,也不会解决我的问题,因为每行都有不同的列数字长度。有什么想法怎么做?我粘贴了一段代码片段,它从文件中读取行并尝试将三个子字符串打印为三个数组元素。

char *arr_x, *arr_y, *arr_z;

fp = fopen(filename, mode);
    while(! feof(fp))
    {
        if( fgets (str, 60, fp)!=NULL ) 
            {
                 strncpy(arr_x, str, ' ');
                 strncpy(arr_y, str, ' ');
                 puts(str);

            }
    }
答案

我相信你走的是正确的道路,只需要添加更多的调整。请看下面的算法。

  1. 定义三个数组,对应于xyz
  2. 阅读整行。
  3. 正如您所想,使用strtok()以空格作为分隔符开始对行进行标记
  4. 将第一个标记存储在i数组的x索引中,y数组中的第二个标记,z数组中的第三个标记。
  5. 继续下一行,增加i并继续存储它们直到fgets()返回NULL。

还有,FWIW,

另一答案

尝试:

while(in != '
') /* while (!fread(&in, 1, 1, p) */
{
     n++;
     arr = (char *) calloc (n, sizeof(char));
     scanf ("%c", &in);
}

抱歉无法在我的手机上缩进。

另一答案

也许使用fscanf会更简单?

我相信这是可信数据,所以缓冲区溢出没有问题,但是如果没有读取带有fgets的数据(这样就限制了你读取的数据量),然后在字符串上使用sscanf

这是我的代码:

#include <stdio.h>

int main() {
    FILE *fp = fopen("read_file_space_delimited.txt", "r");

    if (fp) {        
        int x, y, z;

        while (fscanf(fp, "%d %d %d", &x, &y, &z) != EOF) {
            printf("Numbers: %d %d %d
", x, y, z);
        }

        fclose(fp);
    }
}

文件read_file_space_delimited.txt包含您在问题中提供的数据。编译并运行此程序后,这是我得到的输出:

Numbers: -728 -233 3947
Numbers: 4258 -623 333
Numbers: -500 93 -4141
Numbers: -491 107 -4136
Numbers: -495 94 -4161
Numbers: -886 101 -4148
Numbers: -2555 1864 -4888

以上是关于如何阅读不同长度的子串的主要内容,如果未能解决你的问题,请参考以下文章

回文子串

最短假子串

day 57 代码思想录 647. 回文子串 |

符串的最长无重复字符的子串长度

「Luogu P2408」不同子串个数

leetcode 每日一题 30. 串联所有单词的子串