尝试打印数字字符串中的最后一个元素

问题描述

我在C语言中有这段代码,我将在其中输入一串用空格分隔的数字,然后用strsep对其进行分割。如果我输入了"1 2"之类的字符串,并将strcmp设置为在最后一个元素之前寻找数字,则代码有效,但是如果我将strcmp设置为在最后一个元素之前寻找数字,代码失败。您能提出任何建议吗?

char *string = malloc(1028),*found;
  if (fgets(string,1028,stdin) != NULL) {
    while ((found = strsep(&string," ")) != NULL) {
      if (strcmp(found,"2") == 0) {
        printf("%s\n",found);
      }
    }
  }

解决方法

这是因为found指向的最后一个元素包括换行符。因此,您必须像这样将新行添加到strcmpstrcmp(found,"2\n")(假设2是您的最后一个元素),或者当您调用strsep时,您需要在两个空格上进行标记和换行符:strsep(&string," \n")

完整的解决方案:

char *string = malloc(1028);
if (string) {
  if (fgets(string,1028,stdin) != NULL) {
    char *p = string,*found = string;
    while ((found = strsep(&p," \n")) != NULL) {
      if (strcmp(found,"1") == 0) {
        printf("%s\n",found);
      }
    }
  }
  free(string);
}

要观察的几件事:string指针已由strsep函数修改,因此我已更新代码以使用中间变量p。我还更新了代码以验证分配是否成功,然后在最后释放它。根据您的系统要求,您可以考虑放弃堆并在堆栈上分配string