繁体   English   中英

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

[英]Removing first character from string results in segmentation fault

我试图创建一个程序来读取包含字母[az]的文件。 然后,我用1替换a,用2替换e,用3替换o,用4替换o,用5替换u。我用命令运行程序

./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 //通知否<

然后它可以正常工作,但是当我用<运行它时,它给了我分割错误。 为什么是这样? 根据我的理解,仅将指针向右移动一个字符就不会占用更多内存。

有没有更简单的方法可以做到这一点? 有什么建议么? 谢谢

问题是,无论您在<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

如预期的那样。 但是,调用./test.out aeiou 12345 <6789将导致终端抱怨没有这样的文件6789。然后,我创建了一个名为6789的文件,其中包含文本“ 6789”。 但这不会有任何影响。 输出仍然是:

./test.out
aeiou
12345

您的代码中的问题恰恰是argv[3]为空。 data.txt传递到输入中,但不是argv形式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM