【发布时间】:2015-06-11 09:02:26
【问题描述】:
我正在编写加密程序,但由于错误:“分段错误(核心转储)”而停止。下面的程序假设从两个输入文件打印:
第一个输入文件:先读入,然后大写转小写,小写转大写。
第二个输入文件:应该被读入并且只打印用户想要的字符在文件中出现的次数。在这种情况下,我想要的用户想要的字符是字母“a”。
假设第一个输入文件(input.txt)包含: 你好,我叫乔
这应该打印为:你好,我的名字是乔
假设第二个输入文件(keys.txt)包含:
一个
M
这应该只打印字符:A
注意这并不一定加密输入文件,但是,我正在尝试熟悉一次使用多个输入文件。我可以使用我能得到的所有帮助!谢谢!
另外,编译时,代码应如下所示:
gcc myProgram.c
./a.out e input.txt keys.txt
(上面的“e”代表加密。)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(int args, char *argc[]){
int i,c,x,len,len2;
char str[1024];
char str2[500];
FILE *finp;
FILE *keyFile;
/* ****** CODE TO ENCRYPT STARTS HERE ****** */
if((argc[1]="e")&&((finp = fopen(argc[2],"r"))==NULL)
&&((keyFile=fopen(argc[3],"r"))==NULL)){
printf("Could Not Open file %s\n", argc[2]);
exit(1);
}//End First IF statement
/* *** START CODE TO GRAB FROM 1st INPUT FILE: input.txt *** */
/*Grab strings from first input file and change lower case to upper case and
upper to lower case*/
while(fgets(str,1024,finp)!=NULL){
len = strlen(str);
for(i>0;i<len;++i){
if(((str[i]>=64)&&(str[i]<=90))||((str[i]>=97&&(str[i]<=122))))
str[i]^=32;}}
/* *** END OF CODE FOR 1st INPUT FILE **** */
/* *** START CODE TO GRAB FROM 2nd INPUT FILE: keys.txt **** */
/*Grab character from second input file and print the character*/
while(fgets(str2,500,keyFile)!=NULL){
len2 = strlen(str2);
for(x>0;x<len2;++x){
if(str2[x]=='A'){
putchar(str2[x]);
}}
/* ***** END CODE FOR 2nd INPUT FILE*** */
}
printf("%s\n",str);
fclose(finp);
return 0;}
【问题讨论】:
-
你说的是简单的'return 1'吗?
-
你永远不会在
for循环中初始化x或i。 -
您能否解释一下您在我的 if 语句中所说的非常错误的条件?我现在明白你所说的 'argc[1]="e"' 是什么意思了。
-
@iharob
argc[1]="e"如果argc是可写的,则保证为真,而argc[1]=="e"则保证为假。 (但是argc[1]="e"具有未定义的行为,因为不能保证数组是可写的。)此外:Raoul,不要使用这样的非标准名称 - 标准参数名称是int main(int argc, char *argv[]),并使用argc表示数组参数和args的数字真的很混乱。 -
@Gilles 我第一次没有注意到赋值运算符。
标签: c arrays input command-line-arguments