我是C和指针的新手,所以我遇到了这个问题。我想告诉指针它应指向多少内存。
char * pointer;
char arr[] = "Hello";
pointer = arr;
printf("%s \n", pointer);
此指针将指向整个数组,因此我将在屏幕上显示“Hello”。我的问题是如何才能使指针只能获得“Hel”。
答案 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;
}
备注:强>
substring
的内置函数已经可用,不应该与此混淆。printf
将字符串传递给%s
之类的函数时,该函数会打印所有字符,直到它到达空字符或\0
。实质上,将字符串c
修剪为4个字符意味着您将c[4]
置为null。由于计数从0开始,我们实际上是在改变第5个字符。希望这个例子让它更加清晰。答案 4 :(得分:0)
打印多少字符串由NULL字符“\ 0”控制,C自动附加到每个字符串。如果你想打印出一个部分,要么用“\ 0”覆盖字符串中的字符,要么使用fwrite函数或类似的东西只写几个字节到stdout。