相关疑难解决方法(0)

为什么修改字符串的代码不起作用?

对于c样式的字符串,如何将字符指针指向的内存地址赋予char?例如,在下面的示例中,我想将num更改为"123456",因此我尝试将p设置为'0'所在的数字,并尝试用'4'覆盖它.谢谢.

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char* num = (char*)malloc(100);
    char* p = num;

    num = "123056";

    p = p+3;    //set pointer to where '4' should be
    p = '4';

    printf("%s\n", num );

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c pointers char segmentation-fault access-violation

5
推荐指数
2
解决办法
1万
查看次数

使用指向char而不是char数组的错误

可能重复:
为什么简单的C代码会收到分段错误?

我在Ubuntu中使用GCC编译器和C语言; 我有这个程序:

void foo(char *word)
{
    //something stupid
    *word = 'z';
}

int main()
{

    char word1[] = "shoe";
    char *word2 = "shoe";

    foo(word1);
    printf("%s", word1);
    foo(word2);
    printf("%s", word2);
}
Run Code Online (Sandbox Code Playgroud)

那有什么区别?后者我得到一个segmentation fault错误.

c arrays pointers

4
推荐指数
1
解决办法
207
查看次数

char*和char []是不是同一类型?

可能重复:
为什么在写入字符串时会出现分段错误?

我的C代码遇到了一个奇怪的问题.我正在尝试使用strtok函数拆分字符串,但我得到访问冲突异常.这是我的代码:

char *token;
char *line = "LINE TO BE SEPARATED";
char *search = " ";
token = strtok(line, search); <-- this code causes crash
Run Code Online (Sandbox Code Playgroud)

但是,如果我char *line改为char line[],一切都按预期工作,我没有任何错误.

任何人都可以解释为什么我用strtok得到那个(对我来说很奇怪)的行为?我认为char*和char []是相同且确切的类型.

UPDATE

我正在使用MSVC 2012编译器.

c

4
推荐指数
2
解决办法
594
查看次数

C++:交换指向变量

可能重复:
为什么在写入字符串时会出现分段错误?

我有以下程序:

#include <iostream>
using namespace std;

void reverseString(char* first, char* last)
{
    while(first < last)
    {
        cout << *first << " " << *last << endl; //for debugging; prints 'H' and 'o' then crashes
        char temp = *last;
        *last = *first; //this line crashes the program
        *first = temp;
        first++;
        last--;
    }
}

int main()
{
    char* s = "Hello";
    reverseString(s, s + strlen(s) - 1);
    cout << s << endl;
}
Run Code Online (Sandbox Code Playgroud)

但是,我无法交换指针指向的值.我认为*p =*p1应该只是将p的指向值设置为p1的指向值,但似乎有些东西被搞砸了.在此先感谢您的帮助!

c++ swap pointers

4
推荐指数
1
解决办法
108
查看次数

可以修改C中的字符串文字吗?

最近我有一个问题,我知道一个指向常量数组的指针(在下面的代码中初始化)位于该.rodata区域中,并且该区域仅可读。但是,我在模式C11中看到,此内存地址行为的写入将是不确定的。我知道Borland的Turbo-C编译器可以在指针指向的地方写,这是因为处理器在当时的某些系统上以实模式运行,例如MS-DOS?还是与处理器的操作模式无关?使用保护模式下的处理器,是否还有其他编译器可以写入指针并且不会导致任何内存破坏失败?

#include <stdio.h>

int main(void) {
    char *st = "aaa";
    *st = 'b'; 
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在此代码与MS-DOS中的Turbo-C一起编译时,您将能够写入内存

c gcc x86-16

4
推荐指数
2
解决办法
208
查看次数

C问题中的字符串操作

可能重复:
为什么简单的C代码会收到分段错误?

嘿大家,我确定这是一个非常基本的问题,但显然我在这里并不是很了解.

在寒假期间,我一直在和C玩弄很多东西,只是遇到了一些我觉得可行的东西,却给了我一个分段错误.

如果我将字符串声明为:char name [5] ="Mike"; 我可以操纵字符串:*(name + 1)='a'; 这很好用,名字变成"Make".

如果我声明为:char*name ="Mike"; 然后尝试相同的事情:*(name + 1)='a'; 我遇到了分段错误.为什么我不能这样做?

如果我malloc空格的字符串:char*name =(char*)malloc(5*sizeof(char)); 然后将字符串复制到name:strcpy(name,"Mike"); 我可以像上面那样操纵它就好了.*(name + 1)='a'; 作品.

char*name ="Mike"'和char*name =(char*)malloc(5*sizeof(char))之间有什么区别; 的strcpy(姓名, "迈克");? 它们不只是指向包含字符串的内存吗?

抱歉,这是一个noobish问题!

c string pointers

3
推荐指数
1
解决办法
901
查看次数

尝试修改字符串时出现分段错误

此代码在运行时给出了分段错误.

char *str = "HELLO";
str[0] = str[2];
Run Code Online (Sandbox Code Playgroud)

请有人能告诉我为什么吗?

c

3
推荐指数
2
解决办法
244
查看次数

从字符串中删除空格 - 使用指针的In C风格

所以,它是一个非常简单的问题,我知道解决方案是一个简单的功能,如下所示:

  void removeSpaces(char* s) {
    char* source = s;
    char* dest = s;

    while(*source) {
        if(*source == ' ') {
            source++;
        } else {
            *dest++ = *source++;
        }
    }

    *dest = 0;
}
Run Code Online (Sandbox Code Playgroud)

我正在使用Visual C++ 2008 Express版

当我用以下内容调用它时,它可以正常工作,没有任何问题,即它删除所有空格:

int main() {
    char input[50] = "I       like            2% milk";
    removeSpaces(input);
    cout<<input;

    getchar();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是,问题是当我通过将字符串声明更改为此来调用它时:

char * input = "I       like            2% milk";
Run Code Online (Sandbox Code Playgroud)

我得到一个例外(某种访问违规)

removeSpace函数的这行代码显示异常

*dest++ = *source++;
Run Code Online (Sandbox Code Playgroud)

任何人都可以详细说明为什么会发生这种情况?

c++ string pointers

3
推荐指数
1
解决办法
1931
查看次数

为什么在我仍然可以访问这些位置时遇到段错误?

我试图使用两个指向相同字符串的指针就地反转一个字符串.第一个(char *p)指向字符串的起始位置,第二个(char *q)指向字符串的结束位置.因此,当我尝试使用gdb进行调试时,我在第16行遇到了分段错误.

当我试图打印的价值*p*q,它工作正常.为什么我仍然能够访问这些位置时遇到段错误?

Breakpoint 1, main () at reverse.c:16
16          *q = *p;
(gdb) print p
$1 = 0x5555555547e4 "hello"
(gdb) print q
$2 = 0x5555555547e8 "o"
(gdb) step

Program received signal SIGSEGV, Segmentation fault.
0x00005555555546db in main () at reverse.c:16
16          *q = *p;
Run Code Online (Sandbox Code Playgroud)

该程序的实际代码是

#include<stdio.h>

int main() {
    char *array = "hello";

    char *p=&array[0];// pointer to the first element

    // Make q point to last value of the array …
Run Code Online (Sandbox Code Playgroud)

c string reverse pointers segmentation-fault

3
推荐指数
1
解决办法
60
查看次数

为什么我不能为指针赋值?

在阅读了faq和我能找到的其他所有内容后,我仍然感到困惑.如果我有一个以这种方式初始化的char指针:

char *s = "Hello world!"

字符串在只读内存中,我无法像这样更改它:

*s = 'W';
Run Code Online (Sandbox Code Playgroud)

制作"Wello世界!".我理解这一点,但对于我的生活,我不能理解如何使它不是只读的.我必须使用数组而不是指针吗?喜欢这里

这是我的代码:

char *s = str;
char *e = s;
while (*e != '\0')
e++;
e--;
char *temp;
//Swop the string around
while (s <= e) {
    *temp = *s;
    *s = *e;
    *e = *temp;
    e--;
    s++;
}
Run Code Online (Sandbox Code Playgroud)

错误消息只是一个分段错误.如果这是一个非常愚蠢的问题,请提前道歉.

非常感谢所有的帮助.在接受了你的所有建议后,我得到了这个:

void something(char * str) {
    char *store = str;
    char *s = new char[strlen(str) + 1]; //Allocate memory. Nice one.
    strcpy(s, str);
    char *e = new char[strlen(str) …
Run Code Online (Sandbox Code Playgroud)

c++ pointers readonly segmentation-fault

2
推荐指数
2
解决办法
4568
查看次数