当我尝试将字符添加到字符串测试时,我一直收到分段错误。我尝试了多次迭代,无法弄清楚为什么我会收到错误。我尝试将测试设置为\0
。我无法弄清楚我是如何访问外部测试的。
#include <stdio.h>
#include <cs50.h>
#include <ctype.h>
#include <string.h>
#define _XOPEN_SOURCE
#include <unistd.h>
#include <crypt.h>
//this intializes the argument count and argument vector
int main(int argc, string argv[]) {
//this makes sure it is a string
if (argv[1] != NULL) {
//this makes sure that the user typed 2 arguments,
// the second being the keyword
if (argc != 2) {
printf("no hash inputed\n");
return 1;
}
//main program once the keyword has been verified
int h_len = strlen(argv[1]);
string hash = argv[1];
string test = "A";
int p_len = 0;
printf("H len is %i and P len is %i\n", h_len, p_len);
printf("%s and test: %s\n", hash, test);
//this will iterate through the 1st space and test the charachters
for (int j = 0; j < 4; j++) {
//iterates through the characters that can be used in the password
//for (int i = A; i < z; i++)
//for (char ch = 'A' ; ch <= 'z' ; ch == 'Z' ? ch = 'a' : ++ch )
for (char i = 'A'; i <= 'z'; i++) {
//this skips the ASCII inbetween Z and a
if (i > 'Z' && i < 'a') {
i = 'a';
}
printf("%c", i);
//test[j] = test[j] + (char)i;
test = strncat(test, &i, 1);
printf(" test is %s\n", test);
...
答案 0 :(得分:4)
在此声明中
string test = "A";
向字符串文字test
声明指针"A"
。你可能不会改变字符串文字。
根据C标准(6.4.5字符串文字)
7未指明这些阵列是否与它们不同 元素具有适当的值。 如果程序尝试 修改这样的数组,行为未定义
但是在本声明中
test = strncat(test, &i,1);
尝试修改指针test
指向的字符串文字。
您应该声明一个具有足够空间来存储其他字符的字符数组。
此外,如果您使用函数strncat
从源字符串中复制n
字符,则应在n + 1
个字符的目标数组中保留内存,因为该函数始终附加终止值0
即(C标准,7.23.3.2 strncat函数,脚注302)
302)因此,可以结束的最大字符数 s1指向的数组是strlen(s1)+ n + 1。
答案 1 :(得分:1)
请注意,在这个可怕的cs50中,string
被定义为char *
,因此string test = "A";
相当于char *test = "A";
,它将使测试点成为长度为1的常量字符串再加上一个空!
所以即使连接任何东西都足够长,你也不能因为它是只读的,即使它不是只读的,你也不能,因为它不够长。
答案 2 :(得分:0)
你有一个字符串,其中包含一个字符(test =“A”),因此它的长度为2(A + null char)并且正在尝试将其他字符附加到其中,因此它将在测试之外访问。
答案 3 :(得分:-1)
这里一切都错了
你不能使用strcat char *和char的地址,因为你不知道该字符后是否有零。你的字符串太短,无法容纳超过一个字符串的任何内容。接下来 - 您尝试对RO内存执行某些操作,因为test
指向字符串文字。
买一本关于C的好书