【问题标题】:Removing first character from string results in segmentation fault从字符串中删除第一个字符会导致分段错误
【发布时间】:2015-10-27 04:29:19
【问题描述】:

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

./tr aeiou 12345

我的代码是:

#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 //注意没有

然后它工作正常,但是当我使用 <.>

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

【问题讨论】:

  • 我想你会发现argv[3] 是空的。使用调试器进行确认。您应该检查argc 并记住 C 以零索引开始数组。
  • @EdHeal 你是对的,但argv[0] = ./tr
  • &lt; 是输入重定向。这不是程序参数。
  • @CrakC:我真的不在乎你相信是什么;)
  • @JackWilliams:目前无法给出正确答案,因为我们不知道您想做什么。

标签: c segmentation-fault argv


【解决方案1】:

问题在于,无论&lt;data.txt 之间是否有空格,&lt; 都会被 shell 解释为文件输入运算符,因此不会传递到程序中。我用C写了以下sn-p:

#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 &lt;6789 会导致终端抱怨没有这样的文件6789。然后我创建了一个名为6789 的文件,其中包含文本“6789”。但不会有任何影响。输出仍然:

./test.out
aeiou
12345

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

【讨论】:

  • "data.txt 被传递到输入中,但不是以 argv 的形式" - 仅当程序 使用 来自 stdin 的输入时,这是文本的来源该文件将被重定向到。 OP的程序不使用stdin
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-19
  • 2017-08-02
  • 1970-01-01
  • 1970-01-01
  • 2012-09-23
  • 1970-01-01
  • 2015-09-03
相关资源
最近更新 更多