如何使用指针仅指向数组的一半

时间:2016-05-15 16:28:03

标签: c arrays pointers char

我是C和指针的新手,所以我遇到了这个问题。我想告诉指针它应指向多少内存。

char * pointer;
char arr[] = "Hello";
pointer = arr;
printf("%s \n", pointer);

此指针将指向整个数组,因此我将在屏幕上显示“Hello”。我的问题是如何才能使指针只能获得“Hel”。

5 个答案:

答案 0 :(得分:2)

你可以试试这个:

char * pointer;
char arr[] = "Hello";
pointer = arr;
pointer[3] = '\0';    // null terminate of string
printf("%s \n", pointer);

如果您始终使用字符串,请查看strlen以获取字符串的长度。如果字符串arr的长度为l,那么您可以设置arr[l/2] = '\0',这样当您打印arr时,只会显示其上半部分。

您可能还想打印字符串arr的后半部分?您可以使用指针指向您想要的任何位置作为开始。回到您的示例,您可以尝试:

char * pointer;
char arr[] = "Hello";
pointer = arr + 2;  // point to arr[2]
printf("%s \n", pointer);

检查一下你会得到什么。

答案 1 :(得分:2)

printf能够使用格式字符串中的精度值打印少于完整字符串。对于固定数量的字符(例如3),它就像

一样简单
printf( "%.3s\n", pointer );

对于可变数量的字符,使用星号表示精度,并在指针前传递长度

int length = 3;
printf( "%.*s\n", length, pointer );

答案 2 :(得分:1)

你不知道指针是什么,所以我会解释。 指针指向字符串。它指向一个炭!是的,一个炭火。 C中的字符串实际上只是内存中一个接一个的字符集。 char *指针指向字符串的开头。当存在'\ 0'(又名为null)字符时,字符串结束。当你printf("%s",s)时,printf所做的是这样一个循环:

int i;
for(i=0;1;i++) //infinite cycle
{
    if(s[i]=='\0')
        break;
    printf("%c",s[i]);
}

意味着它不会打印字符串,而是打印char数组中的所有字符,直到找到空字符或它进入未保留的内存空间(分段错误)。

要打印前3个字符,您可以执行以下操作:

void printString(char* s,int n)  //n=number of characters you want to print
{
    if(n>strlen(s))
        n=strlen(s);
    else if(n<0)
        return;
    char temp=s[n];   //save the character that is in the n'th position of s (counting since 0) so you can restore it later
    s[n]='\0';   //put a '\0' where you want the printf to stop printing
    printf("%s",s);   //print the string until getting to the '\0' that you just put there
    s[n]=temp;   //restore the character that was there so you don't alter the string
}

此外,您的pointer声明是不必要的,因为它指向与arr完全相同的位置。您可以使用printf("%p %p\n",arr,pointer);

进行检查

答案 3 :(得分:0)

你可以用一个小函数来实现这个目标,比如子串。

#include<stdio.h>
#include<string.h> // for accessing strlen function

void substring(char* c,int len)
{
    if (len <= strlen(c)){
        *(c+len)='\0';
        printf("%s\n",c);
    }
    else{
        printf("Sorry length, %d not allowed\n",len);
    }
}

int main(void)
{
    char c[]="teststring";
    char* ptr=c;
    substring(ptr,4);  // 4 is where you wish to trim the string.
    return 0;
}

备注:

  1. 在C ++中,一个名为substring的内置函数已经可用,不应该与此混淆。
  2. 当使用格式说明符printf将字符串传递给%s之类的函数时,该函数会打印所有字符,直到它到达空字符或\0。实质上,将字符串c修剪为4个字符意味着您将c[4]置为null。由于计数从0开始,我们实际上是在改变第5个字符。希望这个例子让它更加清晰。

答案 4 :(得分:0)

打印多少字符串由NULL字符“\ 0”控制,C自动附加到每个字符串。如果你想打印出一个部分,要么用“\ 0”覆盖字符串中的字符,要么使用fwrite函数或类似的东西只写几个字节到stdout。