2014-05-23 228 views
-2

我试图使用wcstok()字符串来得到wchar_t字符串的每一行,该字符串应该包含至少两行,最新的'wcstok(0,L“\ n”)'总是为空结果我得到i的值使用printf作为1而不是2或更高,但问题在做#if 0而不是#if 1时得到解决。 这是下面的代码:wcstok()无法正常工作?

 wchar_t* w; 
    wchar_t* line; 
    int j; 
    wchar_t**** lines; 
    int** linescount; 
     ...... 
    int i=0; 
#if 1 //problem get solved when changing to #if 0 
    line = wcstok(w, L"\n"); 
    do{ 
    ((*linescount)[j])++; 
    }while(line=wcstok(0, L"\n")); 
    (*lines)[annex] = calloc(sizeof(wchar_t**), (*linescount)[j]); 
#endif 
    line = wcstok(w, L"\n"); 
    do{ 
#if 1 //problem get solved when changing to #if 0 
     (*lines)[j][i] = calloc(sizeof(wchar_t*), wcslen(line)+1); 
     wcscpy((*lines)[j][i], line); 
#endif 
     i++; 
    }while(line=wcstok(0, L"\n")); 
    printf("i = %d\n", i); /*prints the i value to check if the latest line=wcstok(0, L"\n") worked correctly or not*/ 

有啥认为这个问题的原因是什么?我该如何解决它?请帮忙。

回答

1

wcstok修改了作为参数传递的字符串,所以一旦你运行你的循环来计算行的缓冲区基本上是kaputt。

当你轻松地循环访问\ n的缓冲区计数值时,使用wcstok来计算行数似乎有些过火。

+0

那么问题的原因是什么? wcstok()循环又被执行了吗?或究竟是什么? – user3457200

+0

因为第二次写'line = wcstok(w,L“\ n”)时缓冲区已经在第一个#if 1中修改过了;'它将无法正常工作。 –

+0

@ user3457200那么,问题的根源*原因是你不明白'wcstok()* *做了什么*。它用空字符替换发现的分隔符。在数据缓冲区中进行第二遍传递,寻找前一个消息刚刚消失的事情自然不会找到现在消失的消息,因此返回NULL。对于这个任务,首先不需要wcstok,但是如果你真的使用它,它应该只是第二遍,而不是第一遍。只需走字符串并为第一遍计数换行符,并且不要忘记,最后一个字符串可能不会以一个结尾。 – WhozCraig