从字符串中删除第一个字符会导致分段错误
Removing first character from string results in segmentation fault
我正在尝试创建一个程序来读取包含字母 [a-z] 的文件。然后,我将 a 替换为 1,将 e 替换为 2,将 i 替换为 3,将 o 替换为 4,将 u 替换为 5。我 运行 使用命令
的程序
./tr aeiou 12345 < data.txt //No space between the < and 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] != '[=10=]') {
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 //Notice no <
然后它工作正常,但是当我 运行 使用 <.为什么是这样?根据我的理解,它不应该通过将指针向右移动一个字符来占用更多内存。
有更简单的方法吗?有什么建议么?谢谢
问题是,无论 <
和 data.txt
之间是否有 space,<
都会被 shell 解释作为文件输入运算符,因此不会被传递到程序中。我在 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
.
的形式
我正在尝试创建一个程序来读取包含字母 [a-z] 的文件。然后,我将 a 替换为 1,将 e 替换为 2,将 i 替换为 3,将 o 替换为 4,将 u 替换为 5。我 运行 使用命令
的程序./tr aeiou 12345 < data.txt //No space between the < and 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] != '[=10=]') {
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 //Notice no <
然后它工作正常,但是当我 运行 使用 <.为什么是这样?根据我的理解,它不应该通过将指针向右移动一个字符来占用更多内存。
有更简单的方法吗?有什么建议么?谢谢
问题是,无论 <
和 data.txt
之间是否有 space,<
都会被 shell 解释作为文件输入运算符,因此不会被传递到程序中。我在 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
.