C语言如何将字符串添加到字符串数组?赋值报错该如何解决?
C语言二维字符数组存储strtok切分结果问题修复
错误原因
- C语言中
char arr[100][100]这类静态二维字符数组的行地址arr[i]是常量指针,属于不可修改的左值,无法直接用=赋值指针地址,因此arr[0] = token会抛出expression must be a modifiable lvalue错误。 arr[0][0]是单个char类型变量,只能存储单个字符,和字符串指针类型不匹配,因此仅适用于char类型赋值场景。
修正方案
使用字符串拷贝函数strcpy,把token指向的字符串内容复制到arr对应的行内存空间中即可。同时注意你当前循环里每次都写arr[0]会持续覆盖第一个元素,需使用循环变量i作为数组索引存储所有切分结果。另外要注意strtok的输入参数StringToBeSplit必须是可修改的字符数组,不能是只读字符串常量,否则会触发运行时错误。
修正后的完整代码如下:
#include <stdio.h> #include <string.h> int main() { // 待切分字符串必须定义为可修改的字符数组,不可使用char *StringToBeSplit = "xxx"的写法 char StringToBeSplit[100] = "sample string to be split"; char arr[100][100] = {}; char *token = strtok(StringToBeSplit, " "); int i = 0; // 增加i < 100的边界判断,防止数组越界 while(token != NULL && i < 100) { strcpy(arr[i], token); printf("arr[%d] = %s\n", i, arr[i]); token = strtok(NULL, " "); i++; } return 0; }
补充注意:如果无法确定token的长度,可使用
strncpy(arr[i], token, 99),并手动在末尾补\0,避免缓冲区溢出风险。
如果你的需求确实是仅将第一个token存入arr[0],在第一次完成strcpy后添加break跳出循环即可。
内容的提问来源于stack exchange,提问作者benman
相关产品推荐
相关产品推荐

