2014-10-20 5 views
-3

Я нашел эту программу в режиме онлайн, которая претендует на разделение строки на формат «firstName/lastName». Я проверил, и она работает:Символьные указатели и строки

char *splitString(char* ptrS, char c){ 
    while(*ptrS != c){ 
     if(*ptrS == '\0'){ 
      return NULL; 
     }  
     ptrS++; 
    } 
    return ptrS; 
} 

int main(){ 

    char word[100]; 
    char* firstName; 
    char* lastName; 

    printf("Please insert a word : "); 
    fgets(word, sizeof(word), stdin); 
    word[strlen(word)-1] = '\0'; 

    firstName = word; 
    lastName = splitString(word, '/');  
    if(lastName == NULL){ 
     printf("Error:/not found in string\n"); 
     exit(-1); 
    } 

    *lastName = '\0'; 
    lastName++; 
    printf("First name %s, Last name %s\n",firstName, lastName); 
    return(0); 
} 

Что я вижу здесь, однако, только один символ массива создается, а firstName и lastName указатели помещаются properly.Maybe это потому, что я немного запутался о связи между указателями и массивами, но у меня есть несколько вопросов по этой программе:

  • Сколько строк - массивы char - создаются после выполнения программы?
  • Являются ли указатели на символы, используемые в этой программе, такими же, как строки?
  • Почему я могу использовать эти указатели символов, используемые в качестве строк в printf? Я могу использовать указатели символов как строки для каждой программы на C?

В качестве следствия, какова связь между указателями и массивами? Можно ли их использовать взаимозаменяемо?

+3

Знаете ли вы определение строки в C? Лучше не задавать много вопросов вместе, и вам легко найти ответы на хотя бы некоторые из ваших вопросов, если вы немного поработаете. –

ответ

1

Сколько строк -as char arrays- производится после выполнения программы?

Есть 1 массив символов в этой программе, а именно word[100], другие, как firstName и last Name только символьные указатели ..

ли символьные указатели, используемые в этой программе так же, как строки?

Символьные указатели очень сильно отличаются от строк, Символьные указатели то, что вы можете использовать, чтобы указать на char или string. В этой программе firstName и lastName только символьные указатели, которые используются для точки в различных местах массива символов word[] разделить массив со

2

Сколько струн его символьного arrays- производится после того, как программа выполняются?
У вас есть один char[], размером 100. Однако в конце выполнения программы у вас на самом деле есть две строки, которые хранятся в ней.

string представляет собой набор char с хранящимися в памяти непрерывно с концевыми '\0' (null/0).
В этой программе мы берем ввод и ищем символ '/'.Когда найден, он заменяется строкой терминатора:

"John/Smith\0" 
"John\0Smith\0" 

указатель на начало массива позволит нам получить доступ к первой строке («John»), и указатель, который ранее указывал на '/' характер увеличивается, так что он теперь указывает на "Smith"

инициализации:

"John/Smith\0" 
^  
|  
word/firstname 

lastName = splitString(word, '/'); после:

"John/Smith\0" 
^ ^
| lastname 
word/firstname 

после *lastName = '\0'; lastName++;:

"John\0Smith\0" 
^ ^
|  lastname 
word/firstname 

Так что есть еще только один массив (word), но у вас есть два указателя (firstname & lastname) к струнам внутри.

Являются ли указатели на символы, используемые в этой программе, такими же, как строки?
Указатели char* не являются строками, но они указывают на них. Вы можете передать указатели на любую функцию, ожидающую строку (я раздвигаю бит ниже)

Почему я могу использовать эти указатели на символы, используемые в качестве строк в printf? Я могу использовать указатели символов как строки для каждой программы на C?
В C (и C++) функции не могут передавать массивы данных. Функция, как это:

int func(char string[]){} 

фактически не будет принят сам массив, но вместо этого, он будет передан указатель на начало массива.
Это часто бывает, что используется [] обозначения, где функция будет работать на массиве (в функциональных заголовках char* str и char str[] эквивалентны), как он удаляет любую двусмысленность, что указатель не там, чтобы ссылаться на одну char (или int и т. д.).
принимает указатели на строку и, зная, что это строка (благодаря идентификатору %s в строке формата), он распечатает каждый char из области памяти, которую указатель идентифицирует, пока он не достигнет символа '\0'.
Действительная строка всегда имеет этот терминатор, поэтому при работе со строками это безопасно.
Вы часто будете видеть функции, которые принимают массив, и дополнительный параметр для обозначения размера массива:

int do_something_with_array(int array[], size_t array_length){} 

Это потому, что без значения завершающего или зная размер массива, нет никакого способа, знать, что вы оставили массив и начали обрабатывать out of bounds, который не разрешен и может привести к повреждению памяти или привести к тому, что среда выполнения может убить вашу программу (сбой).

Это распространенное заблуждение, что указатели и массивы одинаковы.
В большинстве случаев вы обрабатываете массивы с помощью указателей, так что обработка данных одинакова, независимо от того, есть ли у вас массив или указатель на один. Однако есть некоторые вещи, которые нужно иметь в виду; this в качестве примера.

+0

Очень приятное объяснение :) –

Смежные вопросы