C -SSCANF循环仅读取第一个输入多次



我使用sscanf进行了从输入中取出的一个字符串,并将每个令牌存储在结构中。问题在于SSCANF仅读取字符串的第一个单词,而不会向前介绍下一个单词,一遍又一遍地打印出相同的令牌。这是代码。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define dim 30
typedef struct string { 
  char* token[dim];
}string;
int main() {
  string* New = (string *)malloc(dim*sizeof(string));
  char* s;
  char buffer[dim];
  int i = 0, r = 0, j = 0;
  s = (char*)malloc(sizeof(char*));
  printf("nString to read:n");
  fgets(s, dim, stdin);
  printf("nThe string is: %s", s); 
  while(sscanf(s, " %s ", buffer) != EOF) {
    New->token[i] = malloc(dim*sizeof(char));
    strcpy(New->token[i], buffer);
    printf("nAdded: %s", New->token[i]);
    ++i;
  }
}

例如,如果我将"这是一个字符串"作为输入,那么SSCANF只会多次获得"此"这个词,而无需转到下一个单词。

您需要递增源sscanf()的指针,以免一次又一次地读取。

此外,通过您为s动态分配的内存没有任何意义。无论如何,这太少了。通过稍后在代码中拨打fgets()的电话,我可以看到您要说s = malloc(dim * sizeof(char));,所以我继续进行修复。

示例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define dim 30
typedef struct string {
  char* token[dim];
} string;
int main() {
  string* New = malloc(dim*sizeof(string));
  char* s;
  char buffer[dim];
  int i = 0;
  s = malloc(dim * sizeof(char));
  fgets(s, dim, stdin);
  printf("The string is: %sn", s); 
  char* ptr = s;
  int offset;
  while (sscanf(ptr, "%s%n", buffer, &offset) == 1) {
    ptr += offset;
    New->token[i] = malloc(strlen(buffer) + 1);
    strcpy(New->token[i], buffer);
    printf("Added: %sn", New->token[i]);
    ++i;
  }
  // do work
  for(int j = 0; j < i; ++j)
    free(New->token[i]);
  free(New);
  free(s);
  return 0;
}

输出:

The string is: this is a string
Added: this
Added: is
Added: a
Added: string

ps:我不确定您想到的结构模式,也许您需要花一两分钟的时间,考虑两次。我的意思是您的设计方法是否有意义。

pps:与您的问题无关:我会抛出Malloc的结果吗?否!

编辑:正如@Chux所说,sscanf()" %s%n"中的" "没有目的。我将其更改为"%s%n"

此外,为了保留所需的准确的内存(处理动态内存分配时要做的事情),将New->token[i] = malloc(dim*sizeof(char));更改为New->token[i] = malloc(strlen(buffer) + 1);

相关内容

  • 没有找到相关文章