* Description : This program allows a user to enter a password and and the name of a text file. After the user
* has entered sufficient information, the program will encode the text and save the overwrite the file with the
* encoded message.
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char make_lower (char ch){//This converts the text of the selected file to all be lowered
int i;//initializing
if (isalpha(ch)==1) ch=tolower(ch);//if the selected item in the file is an uppercase character, then it converts it to lowercase.
else;//other-wise do nothing
return ch;
}
void randomize ( char arr[], int n, int pswd )//Function that randomizes the alphabet to use while encoding
{
int i;//initialing
char ch;//initializing
// Use a different seed value so that we don't get same
// result each time we run this program
srand (pswd);//using the seed the user has entered
// Start from the last element and swap one by one. We don't
// need to run for the first element that's why i > 0
for ( i = 0; i < 26; ++i)//for loop the iterates through the alphabet array
{
// Pick a random index from 0 to 25
int random = rand()%26;
// Swap arr[i] with the element at random index
char tmp = arr[random];//swapping
arr[random] = arr[i];//swapping
arr[i] = tmp;//swapping
}}
char encode (char ch, char alpha[]){//function that encodes a message using the alphabet that was randomized
int i, tmp;//initializing
if (isalpha(ch)== 2){//if the selected character is a lowercase then it gets swapped with the "encoded" character.
int k = ch;
ch = alpha[k-97];
}
return ch;}
int main(int argc,char *argv[]) {
char alpha[26] = ("abcdefghijklmnopqrstuvwxyz");//initializing char array
randomize(alpha, 26, argc);
int i=0;
char ch;
while (argv[i] != EOF){
ch = argv[i];
ch = make_lower(ch);
ch = encode(ch,alpha);
putchar(ch);
++i;
}
}
我不知道为什么我一直收到错误:分段错误(核心转储)。 我相信我有一个流氓指针,但我不知道如何解决它。我使用过调试器,似乎无法解决问题。
有人可以帮忙吗?谢谢!
答案 0 :(得分:4)
问题是你循环argv[]
寻找你不会遇到的EOF。因此,只要i> = = argc,你的while循环就会超出范围。
while (argv[i] != EOF){ // ouch !!!
... // process argv[i]
++i;
}
你必须循环i<argc
:
for (i = 0; i<argc; i++) {
... // process argv[i]
}
其他问题:
作为一般惯例,定义像这样的常量字符串;
char alpha[] = "abcdefghijklmnopqrstuvwxyz"; //will automatically get the right length
但是,您使用的错误长度(忘记字符串的nul-terminator)不是核心转储的原因,因为在randomize()
中您只能使用变量来访问此char数组严格小于26,你似乎不会使用依赖于此终结符的c字符串函数。
如果可以确保仅对小写字符进行编码,则函数encode()
也只能访问索引0到25。不幸的是,这里存在核心转储的风险,因为isalpha(ch)==2
没有确保这一点:isalpha()
为字母数字返回非零值。因此,您最好使用islower()
代替:
if (islower(ch)) { //if the selected character is a lowercase then it gets swapped with the "encoded" character.
int k = ch;
ch = alpha[k-97]; // that's fine because if islower() is true k is between 97 and 122 and thus k-97 is between 0 and 25.
}
还有其他小问题:
类似的问题出现在make_lower()
,您应该使用isupper()
。但是这里没有使用索引,所以没有核心转储。
最后,我想知道ch = argv[i];
是否编译,因为argv [i]是指向char的指针。所以你应该写ch = *argv[i];
答案 1 :(得分:2)
你的alpha数组有27个元素:26个(每个字母)+&#39; \ 0&#39; (字符串终止符的结尾)
char alpha[27] = "abcdefghijklmnopqrstuvwxyz"
你应该在那之上遍历argc ......
for (int i=0;i<argc;++i) {
f(argv[i]) ....
}
注意:你的整个程序都不太清楚: - )