#c #pointers #char
Вопрос:
У меня есть массив символов s[11]="0123456789";
, и я хочу иметь возможность брать каждую цифру s[i]
(используя цикл for) и каким-то образом приводить ее к a char*
(мне нужен символ* специально, потому что мне нужно использовать strncat в какой-то другой строке)
Я пытался сделать это в течение последних 4 часов и ничего не мог сделать.
Комментарии:
1. сделайте
s i
, чтобы получитьchar*
позицию ati
2. Если вам нужен указатель на символ в строке, вы можете использовать
amp;s[i]
, что эквивалентно(s i)
. Если вы хотите превратить фактический символ в указатель, как, по-видимому , указывает ваш пост, вы можете использовать(char *)s[i]
, хотя я не могу представить себе полезную цель для этого.3. Хорошо обратите внимание, что указатель на символ в индексе
i
в большинстве случаев не является указателем на строку из одного символа. Это указатель на хвостs
, начинающийся с этого индекса. Это похоже на Х-Й вопрос. Я достаточно уверен, что реальная проблема заключается в том, чтоstrncat
это не тот инструмент для работы, которую вы на самом деле пытаетесь выполнить.4. Если бы вы рассказали нам контекст, например, точную формулировку задания, нам не пришлось бы гадать, чего вы пытаетесь достичь.
5. Вы не хотите «бросать шар в шар *». Вы просто пытаетесь получить адрес персонажа.
Ответ №1:
Если только вы не хотите временно изменить s
или скопировать персонажа где-то в другом месте… Тебе придется нелегко.
s
Временно измените.
int main() {
char s[11] = "0123456789";
for (int i = 0; i < strlen(s); i ) {
// Modify s in place.
const char tmp = s[i 1];
s[i 1] = '';
char *substr = amp;s[i];
// Do something with substr.
printf("%sn", substr);
// Fix s
s[i 1] = tmp;
}
}
Или скопируйте s[i]
в новую строку.
int main() {
char s[11] = "0123456789";
for (int i = 0; i < strlen(s); i ) {
// Create a temporary string
char substr[2];
substr[0] = s[i];
substr[1] = '';
// Do something with substr.
printf("%sn", substr);
}
}
Или, может быть, просто не используйте strncat?
Предполагая, что вы на самом деле используете strncat
или что-то подобное… Эти функции довольно тривиальны, особенно если вы добавляете только один символ. Вы можете просто создать свою собственную версию.
void append_character(char *buffer, int buffer_size, char new_character) {
int length = strlen(buffer);
if (length 2 < buffer_size) {
buffer[length] = new_character;
buffer[length 1] = '';
} else {
// No space for an additional character, drop it like strncat would.
}
}
Или вы могли бы сделать это как простую оболочку вокруг strncat:
void append_character(char *buffer, int buffer_size, char new_character) {
char new_string[2] = { new_character, '' };
strncat(buffer, buffer_size, new_string);
}
Ответ №2:
То, что вы просите, не имеет никакого смысла. Символ — это небольшое число. Указатель — это адрес некоторой памяти. Преобразование символа в указатель не даст вам действительный указатель, но указатель, который выйдет из строя, как только он будет использован.
Для strncat вам нужен массив символов, содержащий строку C. Вы можете создать строку, написав массив символов[2]; (теперь у вас есть массив с пробелом для двух символов), затем массив[0] = whateverchar; массив[1] = 0; и теперь у вас есть строка C с пробелом ровно для одного символа и одного конечного нулевого байта.
Ответ №3:
Еще одна идея:
#include <stdio.h>
#include <string.h>
int main(void)
{
char src[11]="0123456789";
char dest[50]="abc";
char* p = src;
int i = 0;
int len = strlen(src);
for (i = 0; i < len; i )
{
strncat(dest,p,1);
p ;
}
printf("src: %sn", src);
printf("dest: %sn", dest);
return 0;
}
Скомпилирован с помощью gcc под Ubuntu:
$ gcc hello_str.c -o hello_str
Выход:
$ ./hello_str
src: 0123456789
dest: abc0123456789