编译器不允许我编辑传递的字符串

时间:2017-12-06 18:23:27

标签: c string segmentation-fault string-literals

我环顾四周,在其他问题上找不到问题的解决方案。出于某种原因,当我运行程序时,我得到分段错误,这似乎是因为我正在更改给出字符串。我尝试将指针传递给char指针并进行编辑,但无济于事。

我得到了什么:

之前:juanpablo 分段错误(核心转储)

我的代码:

void rm_char(char* word, int pos){

   printf("before: %s\n", word);

   int len = strlen(word);

   int i;

   i = pos;

   while(word[i+1] != '\0'){

     word[i] = word[i+1];

     i++;
   } 

   word[i] = '\0';

   printf("after: %s\n", word);
} 


int main(void){

   rm_char("juanpablo", 2);

}

1 个答案:

答案 0 :(得分:0)

来自C标准(6.4.5字符串文字)

  

7未指明这些阵列是否与它们不同   元素具有适当的值。 如果程序尝试   修改这样的数组,行为是未定义的。

要逃避错误,您可以调用函数

    Scanner scan = new Scanner(new File("credentials.txt"));

    while (scan.hasNextLine() && !found)
    {
        String[] userNpwd = scan.nextLine().split(",");
        if(userNpwd.length() == 2)
        {
            tempUser = userNpwd[0];
            tempPass = userNpwd[1];
            if(tempUser.trim().equals(userName.trim()) && tempPass.trim().equals(userPass.trim()))
            {
                found = true;
                System.out.println("success");
             }
         }
    }

考虑到最好为第二个参数使用类型char s[] = "juanpablo"; rm_char( s, 2 ); 而不是类型size_t,并将变量int用于

len

未在函数中使用。

该函数应声明为

int len = strlen(word);

这是一个示范程序

char * rm_char(char* word, size_t pos);

它的输出是

#include <stdio.h>
#include <string.h>

char * rm_char(char *word, size_t pos)
{
    size_t n = strlen( word );

    if ( pos < n )
    {
        //memmove( word + pos, word + pos + 1, n - pos );
        do 
        {
            word[pos] = word[pos+1];
        } while ( word[pos++] );
    }

    return word;
}

int main(void) 
{
    char word[] = "juanpablo";

    puts( word );
    puts( rm_char( word, 2 ) );

    return 0;
}