字符指针和字符串

时间:2014-10-20 13:27:25

标签: c string pointers

我发现这个程序在线,声称在格式“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);  
}

我在这里看到的是,只创建了一个char数组,firstNamelastName指针正确放置。可能是因为我对这种关系有点困惑指针和数组之间但我对这个程序有一些问题:

  • 程序执行后会生成多少个字符串-as char arrays?
  • 此程序中使用的char指针是否与字符串相同?
  • 为什么我可以在printf中使用那些用作字符串的字符串指针?我可以在每个C程序中使用char指针作为字符串吗?

作为推论,指针和数组之间的关系是什么?它们可以互换使用吗?

2 个答案:

答案 0 :(得分:2)

程序执行后会生成多少个字符串-as char arrays?
您有一个char[],大小为100。但是,在程序执行结束时,实际上存在两个字符串。

string是一组以char'\0' / null)终止的内存中连续存储的0
在此程序中,我们接受输入,并搜索'/'字符。找到后,它将替换为字符串终止符:

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

指向数组开头的指针将允许我们访问第一个字符串(“John”),并且先前指向'/'字符的指针会递增,因此它现在指向{{ 1}}

初​​始化:

"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)到其中的字符串。

此程序中使用的char指针是否与字符串相同?
lastname指针不是字符串,但它们指向它们。您可以将指针传递给任何期望字符串的函数(我在下面展开一点)

为什么我可以在printf中使用那些用作字符串的char指针?我可以在每个C程序中使用char指针作为字符串吗?
在C(和C ++)函数中无法传递数据数组。像这样的函数:

char*

实际上不会传递数组本身,而是传递一个指向数组开头的指针 通常情况是,int func(char string[]){} 表示法用于函数将在数组上运行(函数头[]char* str等效),因为它消除了指针的任何歧义是不是可以引用单个char str[](或char等) int获取指向字符串的指针,并且知道它是一个字符串(由于格式字符串中的Printf()标识符),它将从指针的内存位置打印出每个%s识别直到它到达char字符。
一个有效的字符串总是有这个终结符,因此在使用字符串时,这是安全的 您经常会看到带有数组的函数,以及一个表示数组大小的附加参数:

'\0'

这是因为没有终止值或知道数组的大小,就无法知道你已离开数组并开始处理int do_something_with_array(int array[], size_t array_length){} 这是不允许的,并且可能导致内存损坏或导致杀死程序的运行时(崩溃)。

指针和数组是相同的,这是一种常见的误解 在大多数情况下,您通过指针处理数组,因此无论您有数组还是指向数组的指针,处理数据都是相同的。但是要记住一些事情; this为例。

答案 1 :(得分:1)

  

程序执行后会生成多少个字符串-as char arrays?

这个程序中有1个char数组,即word[100],其他像firstNamelast Name只是char指针..

  

此程序中使用的char指针是否与字符串相同?

字符串指针与字符串非常不同,字符指针可用于指向charstring。在此程序中firstNamelastName只是用于指向字符数组word[]的不同位置以分割数组的字符指针