C 被标记化的fgets()字符串是否可以索引为字符第[0]行,错误:seg
调用C 被标记化的fgets()字符串是否可以索引为字符第[0]行,错误:seg,c,debugging,indexing,segmentation-fault,fgets,C,Debugging,Indexing,Segmentation Fault,Fgets,调用fgets()后,我想要的字符串将仅是第行的第一个字符:line[0]。当我尝试调用%s->line[0]时,我遇到了一个分段错误。我最初的假设是它位于缓冲区或字节中。我还认为可能是指针指向了错误的地址。对strtok()的确切输入调用将是“!11”,比较应在使用isdigit()后读取感叹号部分,然后读取数字。 代码: static const char N[] = "!"; ... int main( int argc, char* argv[]) { ... while
fgets()
后,我想要的字符串将仅是第行的第一个字符:line[0]
。当我尝试调用%s->line[0]时,我遇到了一个分段错误。我最初的假设是它位于缓冲区或字节中。我还认为可能是指针指向了错误的地址。对strtok()的确切输入调用将是“!11”,比较应在使用isdigit()后读取感叹号部分,然后读取数字。
代码:
static const char N[] = "!";
...
int main( int argc, char* argv[]) {
...
while ( ( result = fgets( line, MAX_LEN, stdin ) ) ) {
if ( line[ 0 ] == '#' ) {
printf( "%s", line );
}
//save line to the history list;
else {
cmd = strtok( line, " \n" );
printf("[0] %s\n",cmd);
char *newString;
strcpy(newString,cmd);
// printf("[0][0] %s \n", newString[0]);
} else if (strcmp(cmd[0], N) == 0 ) { //should I use a for loop for history?
if ( isdigit(cmd[1])) {
printf("Found a digit\n");
printf("Executing history command, %i : %s\n", cmd[1], histL[2]);
}
}
在这里,没有将内存分配给newString
,您试图在strcpy()
中使用它
在使用strcpy()
之前,您需要通过malloc()
将内存分配给newString
,如
char *newString = malloc(strlen(cmd));
编辑: 要解决
cmd
的第一个元素,为什么不使用与行[0]=='#'
中使用的相同方法strncmp()
withn=1
也许是这样,但在我看来,检查单个字节有点过分了。您可以直接使用比较==
} else if (strcmp(cmd[0], N) == 0 ) { //should I use a for loop for history?
在这里,没有将内存分配给newString
,您试图在strcpy()
中使用它
在使用strcpy()
之前,您需要通过malloc()
将内存分配给newString
,如
char *newString = malloc(strlen(cmd));
编辑: 要解决
cmd
的第一个元素,为什么不使用与行[0]=='#'
中使用的相同方法strncmp()
withn=1
也许是这样,但在我看来,检查单个字节有点过分了。您可以直接使用比较==
} else if (strcmp(cmd[0], N) == 0 ) { //should I use a for loop for history?
在这里,没有将内存分配给newString
,您试图在strcpy()
中使用它
在使用strcpy()
之前,您需要通过malloc()
将内存分配给newString
,如
char *newString = malloc(strlen(cmd));
编辑: 要解决
cmd
的第一个元素,为什么不使用与行[0]=='#'
中使用的相同方法strncmp()
withn=1
也许是这样,但在我看来,检查单个字节有点过分了。您可以直接使用比较==
} else if (strcmp(cmd[0], N) == 0 ) { //should I use a for loop for history?
在这里,没有将内存分配给newString
,您试图在strcpy()
中使用它
在使用strcpy()
之前,您需要通过malloc()
将内存分配给newString
,如
char *newString = malloc(strlen(cmd));
编辑: 要解决
cmd
的第一个元素,为什么不使用与行[0]=='#'
中使用的相同方法strncmp()
withn=1
也许是这样,但在我看来,检查单个字节有点过分了。您可以直接使用比较==
} else if (strcmp(cmd[0], N) == 0 ) { //should I use a for loop for history?
这将给您一个编译器警告/错误cmd[0]
属于char
类型。
也许你的意思是:
} else if (strncmp(cmd, N, 1) == 0 ) { //should I use a for loop for history?
这将给您一个编译器警告/错误cmd[0]
属于char
类型。
也许你的意思是:
} else if (strncmp(cmd, N, 1) == 0 ) { //should I use a for loop for history?
这将给您一个编译器警告/错误cmd[0]
属于char
类型。
也许你的意思是:
} else if (strncmp(cmd, N, 1) == 0 ) { //should I use a for loop for history?
这将给您一个编译器警告/错误cmd[0]
属于char
类型。
也许你的意思是:
} else if (strncmp(cmd, N, 1) == 0 ) { //should I use a for loop for history?
请记住,数组索引是从零开始的,因此字符串中的第一个字符具有索引
0
。cmd[0]是我的代码中断的地方,索引无关紧要。谢谢你的回复。哦,我在标题中看到了……你可能也应该在正文中更正它。请注意,字符串中的值是(最常见的),这意味着字符'1'
的值是49
。我问了回答这个问题的人。我可以把它改为int,我正在写另一个关于调用'printf(“command,%I”,cmd[1-2]-'0')来确定为它找到的数字范围的问题!11.请记住,数组索引是从零开始的,因此字符串中的第一个字符具有索引0
。cmd[0]是我的代码中断的地方,索引无关紧要。谢谢你的回复。哦,我在标题中看到了……你可能也应该在正文中更正它。请注意,字符串中的值是(最常见的),这意味着字符'1'
的值是49
。我问了回答这个问题的人。我可以把它改为int,我正在写另一个关于调用'printf(“command,%I”,cmd[1-2]-'0')来确定为它找到的数字范围的问题!11.请记住,数组索引是从零开始的,因此字符串中的第一个字符具有索引0
。cmd[0]是我的代码中断的地方,索引无关紧要。谢谢你的回复。哦,我在标题中看到了……你可能也应该在正文中更正它。请注意,字符串中的值是(最常见的),这意味着字符'1'
的值是49
。我问了回答这个问题的人。我可以把它改为int,我正在写另一个关于调用'printf(“command,%I”,cmd[1-2]-'0')来确定为它找到的数字范围的问题!11.请记住,数组索引是从零开始的,因此字符串中的第一个字符具有索引0
。cmd[0]是我的代码中断的地方,索引无关紧要。谢谢你的回复。哦,我在标题中看到了……你可能也应该在正文中更正它。请注意,字符串中的值是(最常见的),这意味着字符'1'
的值是49
。我问了回答这个问题的人。我可以把它改为int,我正在写另一个关于调用'printf(“command,%I”,cmd[1-2]-'0')来确定为它找到的数字范围的问题!这就解决了我的问题!我也在试着拨打后面的电话号码!11是否有方法将字符串拆分为新变量。我建议使用
中的strtol
从st中读取整数