我使用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);
。