首页 > 解决方案 > 将文件逐行拆分为单词数组

问题描述

我正在尝试编写一个将C switch 语句转换为汇编的程序。我的第一步是从文件中读取并逐行将行拆分为单词数组。然后通过其位置处理单词。

例如:你好世界;你好世界;

将变成: 迭代 1: arr[0]= Hello, arr[1]= World 迭代 2: arr[0]= hello, arr[1]= world

出于某种原因,当我尝试打印我的 arr 内容时我得到空值,我不知道如何解决它。将不胜感激一些帮助。谢谢!

这是我的代码:

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

int main() {
    FILE *fptrr;
    char * line = NULL;
    size_t len = 0;
    ssize_t read;
    fptrr = fopen("switch.c", "r");
    if (fptrr == NULL)
        exit(EXIT_FAILURE);
    size_t num = 100;
    char **arr = malloc(num * sizeof(char *));
    while ((read = getline(&line, &len, fptrr)) != -1){
        char* token = strtok(line, " ;");
        int i = 0;
        while (token != NULL) {
            arr[i] = malloc(100);
            strcpy(arr[i], token);
            i++;
            token = strtok(NULL, " ;");
            printf("%s ",arr[i]);
        }


    }
}

这是我要阅读的文件:

long switch1(long *p1, long *p2, long action)
{
    long result = 0;
    switch(action) {
        case 27:
            *p2 = *p1;
            result = *p2;
            break;
        case 25:
            *p1 += *p2;
            result = *p1;
            break;
        case 29:
        case 30:
            *p1 -= 59;
            *p2 -= *p1;
            break;
        case 23:
            *p1 += 60;
        case 21:
            result = *p2;
            result *= result;
            break;
        case 31:
            result = *p2;
            result >>= *p1;
            break;
        default:
            result = 12;
            result <<= 3;
    }
    return result;
}

这是我现在得到的:

(null) (null) (null) (null) (null) (null) (null) switch1(long switch1(long *p1, long *p2, long result = {
 = 27:
 = 0 
 = *p1 

 = *p2 
 *p2 25:
 *p2 

 += *p2 

 = *p1 
 *p1 29:
 *p1 30:
 *p1 

 -= 59 

 -= *p1 
 *p1 23:
 *p1 

 += 60 21:
 60 

 = *p2 

 *= result 
 result 31:
 result 

 = *p2 

 >>= *p1 

 *p1 

 = 12 

 <<= <<= 3 
 result 

标签: c

解决方案


在以下行中,您只为指针分配了内存:

    char **arr = malloc(num * sizeof(char *));

您必须为每个令牌分配内存,然后复制整个令牌:

代替 :

arr[i] = token;

利用:

arr[i] = malloc(100); strcpy(arr[i], token);

注意:以上代码片段的目的是演示问题,而不是展示良好的编程习惯。例如,您必须处理内存释放、检查溢出等。


推荐阅读