Вопрос по string, c – Можно ли изменить строку char в C?

57

В течение нескольких часов я боролся со всевозможными учебниками и книгами по Си, относящимися к указателям, но я действительно хочу знать, возможно ли изменить указатель на символ после того, как он был создан.

Вот что я попробовал:

char *a = "This is a string";
char *b = "new string";

a[2] = b[1]; // Causes a segment fault

*b[2] = b[1]; // This almost seems like it would work but the compiler throws an error.

Так есть ли способ изменить значения внутри строк, а не адреса указателя?

Спасибо

РЕДАКТИРОВАТЬ:

Спасибо всем за ваши ответы. Теперь это имеет больше смысла. Особенно важно, почему иногда это работало нормально, а иногда не работало. Потому что иногда я передаю указатель на символ, а иногда массив (символ работает нормально).

Ваш Ответ

9   ответов
126

char *a = "This is a string"

char a[] = "This is a string";

strcpy()

char *a = malloc(256);
strcpy(a, "This is a string");

malloc()free()

char *a = "hello";a[0]'c'printf("hello");"hello"printf("hello");cello!)

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededrequiresError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
3

Error: User Rate Limit Exceeded

printf("Hello, World\n");

Error: User Rate Limit ExceededError: User Rate Limit Exceeded

Error: User Rate Limit Exceeded

char s[] = "abc", t[3] = "abc";

Error: User Rate Limit Exceeded

s[] = { 'a', 'b', 'c', '\0' }, t[] = { 'a', 'b', 'c' };

Error: User Rate Limit Exceeded

char *p = "abc";

Error: User Rate Limit Exceeded

9

Error: User Rate Limit Exceeded

char *foo = "hello world";

Error: User Rate Limit Exceeded

Error: User Rate Limit Exceeded

0
char *a = "stack overflow";
char *b = "new string, it's real";
int d = strlen(a);

b = malloc(d * sizeof(char));
b = strcpy(b,a);
printf("%s %s\n", a, b);
Error: User Rate Limit Exceeded
1

#include <sys/mman.h>
#include <unistd.h>
#include <stddef.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>

int take_me_back_to_DOS_times(const void *ptr, size_t len);

int main()
{
    const *data = "Bender is always sober.";
    printf("Before: %s\n", data);
    if (take_me_back_to_DOS_times(data, sizeof(data)) != 0)
        perror("Time machine appears to be broken!");
    memcpy((char *)data + 17, "drunk!", 6);
    printf("After: %s\n", data);

    return 0;
}

int take_me_back_to_DOS_times(const void *ptr, size_t len)
{
    int pagesize;
    unsigned long long pg_off;
    void *page;

    pagesize = sysconf(_SC_PAGE_SIZE);
    if (pagesize < 0)
        return -1;
    pg_off = (unsigned long long)ptr % (unsigned long long)pagesize;
    page = ((char *)ptr - pg_off);
    if (mprotect(page, len + pg_off, PROT_READ | PROT_WRITE | PROT_EXEC) == -1)
        return -1;
    return 0;
}

21

char a[] = "This is a string";

char *a = malloc(100);
strcpy(a, "This is a string");
free(a); // deallocate memory once you've done
Error: User Rate Limit Exceeded
2

strdup:

   The strdup() function returns a pointer to a new string which is a duplicate of the string  s.
   Memory for the new string is obtained with malloc(3), and can be freed with free(3).

char *a = strdup("stack overflow");
Error: User Rate Limit Exceededvar = malloc(strlen(str) + 1); strcpy(var, str);Error: User Rate Limit ExceededstrdupError: User Rate Limit Exceeded
Error: User Rate Limit ExceededstrdupError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
0

int stringLength = strlen( sourceString );
char* newBuffer = malloc( stringLength + 1 );

// you should check if newBuffer is 0 here to test for memory allocaton failure - omitted

strncpy( newBuffer, sourceString, stringLength );
newBuffer[stringLength] = 0;

// you can now modify the contents of newBuffer freely

free( newBuffer );
newBuffer = 0;
6

char a[10]; strcpy(a, "Hello");

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded John Baker

Похожие вопросы