C-分割字符串并输入数组

时间:2019-02-19 21:05:53

标签: c c-strings stdio strcpy

我目前正在尝试在C语言中处理字符串,但无法将字符串的拆分值放入数组中。贝娄是我为实现此目的而创建的代码。

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

 int main(){
     char str[]="titanic.txt";
     char parts[2][5];
     char *name = strtok(str, ".");
     for (int i = 0; i < 2; i++){
          parts[i][5] = name;
          char name = strtok(NULL, ".");

     }
     printf("%c\n", str[0]);
     return 0;
  }

我希望从中得到的输出看起来像这样。

 char part[2][10]{
     {'t', 'i', 't', 'a', 'n', 'i', 'c'},
     {'t', 'x', 't'}
 };

或者,我已经尝试过使用字符串复制这样的东西。

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

 int main(){
     char str[]="titanic.txt";
     char parts[2][10];
     char *name = strtok(str, ".");
     for (int i = 0; i < 2; i++){
         strcpy(parts[i], name);
         name = strtok(NULL, ".");

      }
     printf("%s\n", parts[1]);
     return 0;
 }

这是我想要的,但是我想尝试在没有字符串复制的情况下实现它,因为我认为这将帮助我更好地理解字符串,字符和数组。我不想重新发明轮子,我只想更深入地了解。

3 个答案:

答案 0 :(得分:2)

parts数组应该是指针数组,而不是二维字符数组:

char *parts[2];

然后您分配:

parts[i] = name;

如果要从输入字符串复制到parts,则需要声明第二维,其大小足以容纳可能的最大字符串:

char parts[2][10];

然后应该使用strcpy()而不是赋值来复制它。

strcpy(parts[i], name);

请注意,在执行此操作时,您不会为parts提供第二个索引,该索引仅用于访问字符串的特定字符,而不是整个字符串。

答案 1 :(得分:1)

如果要从扩展名中分离出一个文件名实际上与您要完成的工作有关,那么我假设您使用的是Windows,并为此指出了推荐的Windows API库的文档,{{ 3}}。

关于您的实际问题,您的第一个代码不起作用是因为:

  1. 您正在分配给parts[i][5] = name;行中的单个字符。由于parts[i]的类型为char [5],它的位置只有04,因此您也很忙。
  2. 您将name重新声明为单个char而不是char *指针,这是正确的类型,并且在循环范围之外(正确)声明了该指针。您的新变量char name会覆盖现有的char *name变量。

在这种(以及大多数其他)用例中,您无法使用strcpy系列功能来分配给字符数组。语法char foo[] = "Hello World";唯一有效的时间是在声明后立即生效。另外,字符串文字存储在只读存储器中。

答案 2 :(得分:0)

按照您的编码样式,这是解决方案:

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

int main()
{
    char str[] = "titanic.txt";
    char delim[] = ".";
    char parts[2][10];
    char *ptr = strtok(str, delim);
    int i = 0;

    for (i = 0; i < 2; i++){
        if(ptr != NULL)
        {                
            snprintf(parts[i], sizeof(parts[0])  ,"%s", ptr);
            ptr = strtok(NULL, delim);
        }
    }

    printf("'%s'\n", parts[0]);
    printf("'%s'\n", parts[1]);

    return 0;
}
相关问题