0

我有这个字符串: char *path = " one\\\two\\\five\\\six";

当每个单元格都是字符串时,我想将它分成一个数组。我正在使用strtok,购买我的问题是计算为数组分配多少空间。

我正在这样做:

for ( i = 0 ; i < strlen(path) ; i++)
{
   if (path[i] == '\'  && path[i+1] == '\') /*doesn't work! :( */
      counter++
}

比较器行不工作......我也试过写:“\”但它也不起作用。怎么了?

编辑我正在尝试使用 strtok 并且它变得凌乱:(

     char           seps[]      =   "\\";
     char           *elemName   =   NULL;

 elemName = strtok( path, seps );

 while( elemName != NULL )
     {
          /* While there are tokens in "string" */
         /*copy the elemName*/
         stringArr[runner] = strdup(elemName);
         /* Get next token: */
          elemName = strtok( NULL, seps );
     }
 printf("printing the strings!!!!\n");
 for ( i = 0 ; i < arr_size ; i++)
 {
     printf (" %s \n " , stringArr[i]);
 }
4

6 回答 6

1

你需要写'\\'(或数字 92,因为它是\ASCII 值)。\是一个转义字符,如果你想让它包含在字符串中,你需要自己转义它。

解释:\(whatever)在编译阶段被翻译成一个字符。(例如,\n-> ASCII 值为 0x0A 的字符)

于 2012-09-17T11:40:22.707 回答
1

请记住,\字符串或字符文字中的字符是转义字符(如 Yossarian 的回答中所述),这意味着即使您有一个包含编译器的字符串文字,也会将其转换为实际字符串中\\的单个字符。\

因此,如果您在代码中具有:

char *path = " one\\two\\five\\six"

如果您将其打印出来(使用 eg printf),您将看到它:

一\二\五\六

这意味着您的逻辑是错误的,并且您不必检查两个反斜杠,这也意味着您不必担心超出字符串结尾的阅读。

于 2012-09-17T11:48:48.200 回答
0

您必须转义斜杠:'\\'代表反斜杠字符\

于 2012-09-17T11:41:11.090 回答
0

像这样声明的字符串:

char * path = "one\\two"

有 7(+1) 个字符,'o' 'n' 'e' '\' 't' 'w' 'o' ('\0')。那是因为您必须转义单个反斜杠。所以只使用这个:

if ( path[i] == '\\' ) {
  counter++;
}
于 2012-09-17T11:42:24.953 回答
0

使用 '\' 在 "\" 上拆分拆分,因为使用单个 "\" 将不起作用,因为 "\" 是转义字符。

于 2012-09-17T11:52:00.960 回答
0

对于您的分配问题:您应该只为以 NULL 结尾的指向字符串的指针数组分配内存。

因此,遍历字符串,并计算分隔符。您需要分配 2 + 计数。还有一个字符串,然后是分隔符,另外还有一个终止 NULL 指针。

char **strv = malloc( (2 + count) * sizeof( char*) );

下一步是再次遍历字符串,并在刚刚分配的数组中设置指针。就像是:

strv[ i++ ] = string;

for ( pstr = string; *pstr != '\0'; pstr++ ){
    if( *pstr == delimiter ) {
        *pstr = '\0';
        strv[ i++ ] = pstr + 1;
    }
}
strv[ i ] = NULL;

(代码修改原始字符串。)记住释放字符串和分配的指针数组。

我假设 '\\' 是一个转义字符,后跟反斜杠。'\\' 因此只是一个字符。确保代码的计数部分不会计算两次。

-Øystein

于 2012-09-17T12:07:40.473 回答