我有一个C程序,它将一个参数作为输入,如果参数与可执行文件中的字符串匹配,它将返回1,否则为0.可执行文件名为prg1
。我在名为inputs.txt
的文件中有一些输入字符串。我想从输入文件中获取这些字符串,并使用每个字符串调用C程序中的prg1
。
我已经尝试了下面的代码,但它没有工作。没有分段错误但是当我调用prg1它执行时,因为prg1中的printf()语句正在工作,我可以看到output.it更改变量发现0我不能改变prg1。因为我的朋友给了我那个程序的可执行文件,而不是源代码。头文件是stdio.h和string.h
int main()
{
FILE *fk;
char text[80],inp[16],test[50]={"./prg1 "};
int found=100;
fk=fopen("inputs.txt","r");
while((fscanf(fk,"%s",inp))!=EOF)
{
strcat(test,inp);
found=system(test);
if(found==1)
{
printf("\nAnswer is : %s",inp);
break;
}
strcpy(test,"./prg1 ");
}
fclose(fk);
return 0;
}
我的代码出了什么问题?
答案 0 :(得分:0)
prog1
返回1,但1表示错误(至少在linux系统中)。请尝试返回EXIT_SUCCESS
和EXIT_FAILURE
(在stdlib.h
中定义)。然后,当system()
调用返回0时,找到匹配,否则找不到匹配。
答案 1 :(得分:0)
代码中的基本缺陷是,在调用strcat将下一个参数添加到主循环之前,需要在主循环的每次迭代开始时将'test'数组的内容重置为“prg1”。命令行。否则,每次迭代时,要运行的命令将继续变长,因为每个输入读取都会添加到现有命令中。我认为这不是你想要的。
例如,给定两行输入“foo”和“bar”,循环的第一次迭代将导致命令“prg1 foo”被执行,而第二次将导致“prg1 foobar”被执行。检查的一种简单方法是在调用system()之前插入printf(或类似的)以显示将要执行的命令。
使用fscanf分配数组时,还应该检查fopen的返回码并检查数组边界。
答案 2 :(得分:0)
我不确定你想要达到的目的,但这里有一些评论:
1 - 您应该测试fopen的返回值:
if (!fk) { ... }
2 - 您没有在每次测试之间清除test
缓冲区,因此您实际上是在呼叫:
system("prg1 first_word");
system("prg1 first_wordsecond_word");
...
你应该有类似的东西:
strcpy(test, "prg1 ");
进入循环后strcat
之前。
3 - 输入字符串中是否有空格?在这种情况下,您应该修改代码以读取新行。
4 - 您可能希望使用EXIT_SUCCESS
和EXIT_FAILURE
而不是0和1。