尝试连接字符串和char时C中的分段错误

时间:2017-07-13 13:58:05

标签: c arrays string cs50 string-literals

当我尝试将字符添加到字符串测试时,我一直收到分段错误。我尝试了多次迭代,无法弄清楚为什么我会收到错误。我尝试将测试设置为\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);
                ...

4 个答案:

答案 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的好书