我目前正在尝试在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;
}
这是我想要的,但是我想尝试在没有字符串复制的情况下实现它,因为我认为这将帮助我更好地理解字符串,字符和数组。我不想重新发明轮子,我只想更深入地了解。
答案 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}}。
关于您的实际问题,您的第一个代码不起作用是因为:
parts[i][5] = name;
行中的单个字符。由于parts[i]
的类型为char [5]
,它的位置只有0
到4
,因此您也很忙。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;
}