我试图创建一个程序来读入包含字母[a-z]的文件。然后我将1替换为1,将e替换为2,将i替换为3,将o替换为4,将u替换为5.我使用命令运行程序
./ tr aeiou 12345< data.txt //<之间没有空格和data.txt
我的代码是:
#include<stdio.h>
int main(int argc, char **argv)
{
FILE *fp;
fp = fopen(argv[3], "r");
char input[100];
fscanf(fp, "%[^\n]", input);
int a = 0, b = 0;
if(argv[3][0] == '<') {
(*(argv[3]))++; //SEGFAULT
}
while(input[a] != '\0') {
if(input[a] == argv[1][b]) {
input[a] = argv[2][b];
++b;
}
++a;
}
printf("%s", input);
fclose(fp);
return 0;
}
如果我用
运行程序./ tr aeiou 12345 data.txt //注意没有&lt;
然后它工作正常但是当我用&lt;运行它时它给我分段错误。为什么是这样?根据我的理解,只需将指针向右移动一个字符就不会占用更多的内存。
有更简单的方法吗?有什么建议?感谢
答案 0 :(得分:3)
问题在于,无论INSERT
和<
之间是否有空格,shell都会将data.txt
解释为文件输入操作符,因此不会进入了该计划。我在C中编写了以下代码段:
<
只打印出所有参数。致电#include <stdio.h>
int main(int argc, char **argv) {
for (int i = 0; i < argc; i++) {
printf("%s \n", argv[i]);
}
}
会给出:
./test.out aeiou 12345
正如所料。但是调用./test.out
aeiou
12345
会导致终端抱怨没有这样的文件6789.然后我创建了一个名为6789的文件,其中包含文本&#34; 6789&#34;。但它不会产生任何影响。输出仍然是:
./test.out aeiou 12345 <6789
代码中的问题恰恰是./test.out
aeiou
12345
为空。 argv[3]
已传递到输入中,但不会以data.txt
。