2015-01-05 1 views
0

Я не могу изменить отдельные символы в указателе без сбоя программы. R1 должен быть указателем.Как изменить отдельные символы в строке указателя?

char * R1[6];  
int main(){ 
    *R1 = "33333"; 
    printf("%s\n", *R1); 
    R1[3] = '4'; 
    printf("%s", *R1); 
    return 0; 
} 
+0

возможного дубликат (HTTP: // StackOverflow. com/questions/1704407/what-is-the-difference-between-char-s-and-char-s-in-c) – Fernando

ответ

3

Это должно работать для вас:

#include <stdio.h> 

char R1[6] = "33333"; 

int main() { 

    printf("%s\n", R1); 
    R1[3] = '4'; 
    printf("%s", R1); 

    return 0; 

} 

Выход:

33333 
33343 

EDIT:

С указателем это должно работать для вас:

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

int main() { 

    char * R1 = malloc(6*sizeof(char)); 
    strcpy(R1, "33333"); 

    printf("%s\n", R1); 
    R1[3] = '4'; 
    printf("%s", R1); 

    free(R1); 

    return 0; 

} 
+0

Извините, переменная должна быть указателем. – 34hjjekjr

+0

@ 34hjjekjr Обновлен мой ответ, теперь нужно работать! – Rizier123

+0

@ 34hjjekjr: вы можете просто взять указатель на массив, если вы не хотите/не можете использовать динамическое распределение. –

1

Ваш код должен быть таким, чтобы получить его работу

char R1[6]="33333";  
int main(){ 
    printf("%s\n", R1); 
    R1[3] = '4'; 
    printf("%s", R1); 
    return 0; 
} 

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

первая ОШИБКА

char * R1[6]; 

здесь вы объявляете массив 6 указателя, указывающего каждый к полукоксу, но вы хотите массив 6 полукокса, поэтому он должен быть char R1[6];, чтобы получить то, что вы хотите

второго ОШИБКА

*R1 = "33333"; 

на языке C вы не можете назначить строку с помощью оператора =. У вас есть два варианта либо инициализации при объявлении его как то char R1[6] = "33333"; или вы можете использовать функции strcpy(), расположенную в string.h библиотеке и Виль strcpy(R1,"33333");

третья ОШИБКА:

printf("%s\n", *R1); 

когда разыменовывая строку в printf(), вам нужно указать только адрес первого элемента строки, который является именем массива R1, поэтому он должен быть таким, как инструкция

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

то же самое, за последний printf()

+1

Нет, это не работает – 34hjjekjr

+1

@Meninx Эта информация должна быть отредактирована в вашем ответе. – ApproachingDarknessFish

1

переменной вы объявляете не является указателем; это на самом деле массив из шести указателей на символы (вот почему printf не работает).Если вы хотите использовать массив символов, просто написать:

char R1[6]; 

Если вы хотите указатель обугленного, написать:

char *R1; 

и инициализировать его как-то (возможно, с malloc):

/*in main*/ 
R1 = malloc(6); /*six bytes for five chars +null terminator*/ 

Удостоверьтесь в завершении нулевой последовательности:

R1[5] = '\0'; 

После того, как у вас есть действительная, изменяемая * обугленная последовательность, вы можете назначить отдельные голец так же, как вы уже:

R1[3] = '4'; 

Однако, когда речь идет о назначении всей строки, вы хотите использовать strcpy функции вместо оператора =:

/*R1 now contains the text "33333"*/ 
strcpy(R1, "33333"); 

* Когда вы пишете R1 = "33333", вы назначаете на указатель вместо к тексту он указывает. Поскольку "33333" неизменен, вы не сможете назначить значения в своей строке, когда ваша строка является прямой ссылкой на нее.

Так что полная программа может выглядеть следующим образом: [? В чем разница между символом s \ [\] и символом \ * s в C]

char *R1;  
int main(){ 
    R1 = malloc(6); 
    R1[5] = '\0'; 
    strcpy(R1, "33333"); 
    printf("%s\n", R1); 
    R1[3] = '4'; 
    printf("%s", R1); 
    free(R1); 
    return 0; 
} 
+2

@Meninx Это вопрос вкуса. В стандарте указано, что 'sizeof (char) == 1', поэтому совершенно безопасно просто использовать количество байтов, которое вы хотите, но ваш путь также прекрасен, если немного подробный. Строго говоря, «лучшим» способом выделения будет, вероятно, «malloc (6 * sizeof (* R1))», который гарантирует, что правильный объем памяти будет выделен, даже если мы изменим тип R1. – ApproachingDarknessFish