输出错误。可能的strncpy问题?

时间:2013-05-13 21:38:52

标签: c++ pointers malloc free strncpy

所以,我试图让这段代码将从文件输入的每一行解析为单独的标记,然后依次将每一行添加到tklist数组中。然后主要打印出每个令牌。虽然它是打印空白,当我进入代码时,看起来strncpy不起作用。任何想法是什么问题?我没有错。

这是主要功能:

#include <iostream>
#include <fstream>
using namespace std;

#include "definitions.h"
#include "system_utilities.h"


int main()
{
    ifstream inFile;

    char line[MAX_CMD_LINE_LENGTH];
    char* token[MAX_TOKENS_ON_A_LINE];
    int numtokens;

    system("pwd");
    inFile.open("p4input.txt", ios::in);
    if(inFile.fail()) {
        cout << "Could not open input file.  Program terminating.\n\n";
        return 0;
    }
    while (!inFile.eof())
    {
    inFile.getline(line, 255);
    line[strlen(line)+1] = '\0';
    numtokens = parseCommandLine(line, token);
        int t;
        for (t=1; t <= numtokens; t++) {
            cout << "Token "<< t << ": " << token[t-1] << "\n";
        }

    }
    return 0;
}

这是parseCommandLine函数:

int parseCommandLine(char cline[], char *tklist[]){
    int i;
    int length; //length of line
    int count = 0; //counts number of tokens
    int toklength = 0; //counts the length of each token
    length = strlen(cline);
    for (i=0; i < length; i++) {   //go to first character of each token

        if (((cline[i] != ' ' && cline[i-1]==' ') || i == 0)&& cline[i]!= '"') {

        while ((cline[i]!=' ')&& (cline[i] != '\0') && (cline[i] != '\r')){
            toklength++;
            i++;
        }
      //---------------
    tklist[count] = (char *) malloc( toklength +1);
    strncpy(tklist[count], &cline[i-toklength], toklength);
    //--------------
        count ++;
        toklength = 0;
    }

    if (cline[i] == '"') {
        do {
            toklength++;
            i++;
            if (cline[i] == ' ') {
                toklength--;
            }
        } while (cline[i]!='"');

        //--------------
        tklist[count] = (char *) malloc( toklength +1);
        strncpy(tklist[count], &cline[i-toklength], toklength);
        //--------------
        count ++;
        toklength = 0;
    }

}
int j;
for (j = 0; j < count; j++) {
    free( (void *)tklist[j] );
}
return count;

}

就像我说的那样,当我调试它看起来像复制的问题,但我是初学者所以我怀疑我做错了。

感谢您提供任何帮助!!

3 个答案:

答案 0 :(得分:1)

尝试类似

的内容
tklist[count][toklength]='\0';

strncpy(tklist[count], &cline[i-toklength], toklength);

strncpy()不会必然为您添加空终止符。 strncpy需要一些安心使用。

  

如果,目的地末尾没有隐式附加空字符   来源长于数字..

仅限初学者......评论中提到了其他更深层次的问题。

答案 1 :(得分:0)

从malloc / free的通用等价物开始是new / delete(堆内存分配)。

其次你似乎混淆了字符串和c_strings(旧的char *)。 getline使用字符串,你的解析函数使用c_strings它们不是同一个东西,而.c_str()是字符串的成员函数来进行转换。

答案 2 :(得分:0)

  

所以,我试图让这段代码解析从输入的每一行   将文件转换为单个标记,然后依次将每个标记添加到tklist   阵列。

有关

  

从文件输入的每一行

使用

std::ifstream ifs;
std::string s;
/**/
std::getline(ifs, s);

采用你的循环。

  

将[..]解析为单个令牌

看看怎么样     的std :: string 可以帮助您完成该任务(或使用boost::tokenizer)。

这个

  

然后依次将每个[token]添加到tklist数组。

几乎要求std :: list或std :: vector而不是普通的C数组,选择哪个容器取决于例如关于你打算如何处理发现的令牌。