0

我在 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);
      }
    }
  }
4

1 回答 1

2

这是因为found指向的最后一个元素包含换行符。因此,您要么必须添加新行,strcmp像这样:(strcmp(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在堆栈上分配。

于 2020-10-13T05:36:28.647 回答