我的问题很简单,我想使用scanf
过滤输入并将每个单词放入array of string (array char 2d)
我尝试过fgetc()
,但至少对我来说每个单词都很难。
data.txt
add $t3,$s3,$s5
sh $v0,8($s0)
预期结果:
add
$t3
$s3
$s5
sh
$v0
8
$s0
假设我们需要一个10x10的数组:
char test [10][10];
strcpy(test[0],"add");
...
... // looping until the last input
...
strcpy(test[7],$s0);
-编辑-
我尝试了这段仅处理一行测试的代码:
char test[10][10]
char c;
unsigned int i = 0 , j = 0;
FILE *fp = fopen("./data.txt", "rb");
while((c=fgetc(fp)) != EOF )
{
if (c == ' ' || c == '(' || c == ')' ){
}else if( c == '$' || (c == ',')){
i++;
j = 0;
test[i][j]=c;
j++;
}else if(c == '\n'){
i = 0;
j = 0;
break;
}else{
test[i][j]= c;
j++;
}
}
感谢您的时间。
答案 0 :(得分:2)
我来晚了,但是如果您不需要为此使用scanf()
系列功能,则可以使用strtok()
。
做类似的事情
FILE *fin = fopen("input.txt", "r");
if(fin==NULL)
{
return -1;
}
char buff[50];
while(fgets(buff, sizeof(buff), fin)!=NULL)
{
for(char *ptr=strtok(buff, " (),\n"); ptr!=NULL; ptr=strtok(NULL, " (),\n"))
{
printf("%s\n", ptr);
}
}
strtok()
的第二个参数是一个字符串,每个字符都是我们要提取的标记的定界符。
对于给定的输入,输出将为
add
$t3
$s3
$s5
sh
$v0
8
$s0
答案 1 :(得分:1)
#include <stddef.h>
#include <stdio.h>
#include <string.h>
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
#define ARRAY_SSIZE(arr) ((ptrdiff_t)ARRAY_SIZE(arr))
int main (void)
{
FILE *fp;
char buff[BUFSIZ];
char *s;
ptrdiff_t len;
char str[10][10][10];
int n;
fp = fopen("./data.txt", "r");
memset(str, 0, sizeof(str));
for (ptrdiff_t i = 0; i < ARRAY_SSIZE(str); i++) {
if (!fgets(buff, sizeof(buff), fp))
break;
len = strlen(buff);
s = buff;
for (ptrdiff_t j = 0; ((s - buff) < len) &&
(j < ARRAY_SSIZE(str[0])); s += n+1, j++) {
n = 0;
if (sscanf(s, " %9[^ ,()\n]%n", str[i][j], &n) == EOF)
break;
}
}
for (ptrdiff_t i = 0; i < ARRAY_SSIZE(str); i++) {
for (ptrdiff_t j = 0; j < ARRAY_SSIZE(str[0]); j++) {
if (str[i][j][0])
printf("%s\n", str[i][j]);
}
}
return 0;
}
我将每一行分开,以便您在需要时可以分别玩耍。
这是最重要的一行:
if (sscanf(s, " %9[^ ,()\n]%n", str[i][j], &n) == EOF)
break;
它从字符串s
读取," %9[^ ,()\n]"
丢弃所有空格并接受char
的数组,直到找到以下第一个字符为止:" ,()\n"
或直到它达到最大长度9(9 + '\0'
= 10)。字符串存储在str[i][j]
中;之后,"%n"
在n
中存储缓冲区中消耗的字符数,以便您可以将char *
更新为指向下一个未读字符(实际上是该字符之后的一个),因为我们知道第一个未读字符将是逗号或类似的东西,所以它将成为我们不希望使用的字符。该工作(更新指针)在此行中完成:
for (ptrdiff_t j = 0; ((s - buff) < len) &&
(j < ARRAY_SSIZE(str[0])); s += n+1, j++) {