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()
with
n=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()
with
n=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()
with
n=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()
with
n=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中读取整数