C 字符串的子字符串并将其打印出来

C 字符串的子字符串并将其打印出来,c,string,substring,strtok,strncpy,C,String,Substring,Strtok,Strncpy,我要删除以下字符串: char msg[30] ="Hello 13 1"; char *psh; int num1; int num2; char s[30],s[30]; 我尝试过这个,但是: pch = strtok (msg," "); while (pch != NULL) { printf ("%s\n",pch); pch = strtok (NULL, " "); } 哪些产出: Hello 13 1 Segmentation fault

我要删除以下字符串:

char msg[30] ="Hello 13 1";
char *psh;
int num1;
int num2;
char s[30],s[30];
我尝试过这个,但是:

pch = strtok (msg," ");
while (pch != NULL)
  {
    printf ("%s\n",pch);
    pch = strtok (NULL, " ");
   }
哪些产出:

 Hello
 13
 1
 Segmentation fault
我只想让数字'13'等于num1,数字'1'等于num2:

    printf("%d\n",num1);

    Output: 13


    printf("%d\n",num2);

    Output: 1
我尝试:

 sscanf(sc, "%s %d %d", &s, &num1, &num2);
哪些产出:

 Hello
 13
 1
 Segmentation fault
谢谢

[编辑]

 char * pch
 char s[30];
char sc[30];
char num1[30];
char num2[30];



 pch = strtok (s," ");
 while (pch != NULL)
 {
   printf ("%s\n",pch);
   pch = strtok (NULL, " ");
 } 

 sscanf(sc, "%s %d %d", pch, &num1, &num2);
使用以下功能:

sscanf(msg, "%s %d %d", s, &num1, &num2);
这将导致您的代码看起来像这样:

#include <stdio.h>
int main()
{
    char msg[30] = "Hello 13 1";
    int num1, num2;
    char s[30];
    sscanf(msg, "%s %d %d", s, &num1, &num2);
    printf("%d\n%d\n", num1, num2);
    return 0;
}
#包括
int main()
{
char msg[30]=“你好13 1”;
int num1,num2;
chars[30];
sscanf(消息,“%s%d%d”、s和num1和num2);
printf(“%d\n%d\n”,num1,num2);
返回0;
}
如果您有代码

pch = strtok (s," ");
while (pch != NULL)
{
    printf ("%s\n",pch);
    pch = strtok (NULL, " ");
} 

sscanf(sc, "%s %d %d", pch, &num1, &num2);
然后您就有了,因为您试图写入
NULL
指针

循环后,
pch
将为
NULL

另外,
num1
num2
是字符数组(例如字符串),但您尝试将数字提取为整数。虽然数组足够大,可以容纳整数值,但如果希望将它们作为实际整数,则仍然是错误的


您还应该注意修改输入字符串。

不要对字符串使用运算符地址(
&
),它们已经是指针(或者在数组的情况下是指针的衰减)。如果您以前从未尝试过使用调试器,现在正是最好的时机。如果在调试器中运行程序,它将在崩溃位置停止。然后,您可以查看函数调用堆栈,甚至可以查看调用堆栈,这样您就可以查看代码(如果还没有),然后检查变量的值。至少,请使用调试信息构建(将
-g
标志添加到
gcc
)并在调试器中运行,并编辑问题以包括
bt
调试器命令的输出(显示函数调用堆栈,也称为回溯)。您应该检查
sscanf()的返回值
在依赖具有正确值的变量之前。