【问题标题】:strtok and pointers to arraysstrtok 和指向数组的指针
【发布时间】:2014-04-20 06:54:24
【问题描述】:

我正在再次编码,现在将一个文件拆分为一行,并将每一行拆分为一个 char 数组,所以我尝试下一个代码:

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

int main (void)
{   
    int i=0;
    char value[3][1024];
    char (*p)[1024] = value;

    char *p1;
    char *array[4];

    char line[1024];
    FILE *fp=fopen("data1.txt", "r");
    if(fp==NULL){
        printf("\nThe file does not exist\n");
    }
    else{
        while( fgets ( line, sizeof(line), fp ) != NULL  )
        {
            strcpy(p[i],line);
            printf ("%s",p[i]);
            printf("\n");
            i++;    
        }    
    }
    i = 0;
    p1 = strtok(value[i]," "); 
    while (p1 != NULL)
    {
        array[i++] = p1;
        p1 = strtok (NULL, " ");
    }
    printf("%s\t\n", array[0]);
}

当我得到输出时,一切似乎都很好,我文件中的行(一个存储数字的 char 数组)被复制到 p[i]。如果我打印 p[0], p[1] 我得到完整的行。后来我尝试将该行拆分为长度为 4(3 减去 '\0')的字符数组。 strtok 必须使用值之间的制表符空间拆分 value[i]。据此,如果我打印 array[0],我必须只在我的 char 数组中获得第一个值,但我再次获得完整的行 o.O.

我想也许我在 p[i] 处没有 '\0' 或者我使用 strtok 错误。有什么想法吗?现在我正在尝试打印每个值以了解我存储了哪些值,但一切似乎都很好。我会切换到 GDB,也许我会发现我的价值观有些奇怪。

输入文件由制表符空格分隔。

55      2       3      44
1000    33      4      5

【问题讨论】:

  • 输入文件是什么样的?
  • 哦,小精灵,你已经醒了吗? :),我得到:55-2-3-44\n1000-33-4-5\n 在尝试拆分数组并打印数组 [0] 后,我得到:1000-33-4-5 所以不是拆分数组。我必须得到 1000。如果我更改 i=1,我必须得到 55,但我得到整行。
  • 没有空格隔开。
  • 对不起,在我的文件中,“-”是一个空格,我在这里显示符号,因为它删除了所有非代码格式的样式。
  • 它对我来说很好用。 ideone.com/bJmpVL

标签: c arrays pointers


【解决方案1】:

感谢 PIXY,我能够弄清楚代码中发生了什么。

第一个:代码必须是 ASCII。 第二:我真的很傻,因为我需要的令牌是“\t”而不是空格“”,所以代码必须是

p1 = strtok(value[i],"\t"); 
    while (p1 != NULL)
    {
        array[i++] = p1;
        p1 = strtok (NULL, "\t");
    }
    printf("%s\t\n", array[0]);

感谢 idea.com,BLUEPIXY 能够运行代码,因为他使用了由简单空格分隔的字符,而我使用的是选项卡式空格(我需要改进我在问题中提供的数据,我的错)。在欧洲、亚洲和美洲度过愉快的一天,谢谢大家 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 2017-09-03
    • 2021-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-30
    相关资源
    最近更新 更多