从字符串中删除第一个字符会导致分段错误

时间:2015-10-26 20:05:28

标签: c segmentation-fault argv

我试图创建一个程序来读入包含字母[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;运行它时它给我分段错误。为什么是这样?根据我的理解,只需将指针向右移动一个字符就不会占用更多的内存。

有更简单的方法吗?有什么建议?感谢

1 个答案:

答案 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

的形式传递