c语言中如何借用指针输出字符串?

作者&投稿:卞骨 (若有异议请与网页底部的电邮联系)
c语言中如何输入输出字符串~

在C语言中,输入输出字符串有以下两种方式:
1 用scanf/printf输入输出。
scanf/printf是C语言的格式化输入输出函数,可以用于输入输出各种基础类型,字符串(char*)也
其支持范围内。
格式化字符为%s。
定义
char str[100];
输入
scanf("%s",str);
输出
printf("%s",str);
2 C语言还支持专门的字符串输入输出函数:gets/puts。gets的作用为,读入一行输入,并将读到的换行符替换为字符串结束符。puts的作用为,将字符串单行输出,即输出字符串内容后,会自动在结尾增加换行。定义
char str[100];
输入
gets(str);
输出
puts(str);

扩展资料:
起初,C语言没有官方标准。1978年由美国电话电报公司(AT&T)贝尔实验室正式发表了C语言。布莱恩·柯林汉(Brian Kernighan) 和 丹尼斯·里奇(Dennis Ritchie) 出版了一本书,名叫《The C Programming Language》。
这本书被 C语言开发者们称为K&R,很多年来被当作 C语言的非正式的标准说明。人们称这个版本的 C语言为K&R C。
K&R C主要介绍了以下特色:
结构体(struct)类型
长整数(long int)类型
无符号整数(unsigned int)类型
把运算符=+和=-改为+=和-=。因为=+和=-会使得编译器不知道使用者要处理i = -10还是i =- 10,使得处理上产生混淆。
即使在后来ANSI C标准被提出的许多年后,K&R C仍然是许多编译器的最 准要求,许多老旧的编译器仍然运行K&R C的标准。
1970到80年代,C语言被广泛应用,从大型主机到小型微机,也衍生了C语言的很多不同版本。
1983年,美国国家标准协会(ANSI)成立了一个委员会X3J11,来制定 C语言标准。
1989年,美国国家标准协会(ANSI)通过了C语言标准,被称为ANSI X3.159-1989 "Programming Language C"。因为这个标准是1989年通过的,所以一般简称C89标准。有些人也简称ANSI C,因为这个标准是美国国家标准协会(ANSI)发布的。
1990年,国际标准化组织(ISO)和国际电工委员会(IEC)把C89标准定为C语言的国际标准,命名为ISO/IEC 9899:1990 - Programming languages -- C 。
因为此标准是在1990年发布的,所以有些人把简称作C90标准。不过大多数人依然称之为C89标准,因为此标准与ANSI C89标准完全等同。
1994年,国际标准化组织(ISO)和国际电工委员会(IEC)发布了C89标准修订版,名叫ISO/IEC 9899:1990/Cor 1:1994,有些人简称为C94标准。
1995年,国际标准化组织(ISO)和国际电工委员会(IEC)再次发布了C89标准修订版,名叫ISO/IEC 9899:1990/Amd 1:1995 - C Integrity [7] ,有些人简称为C95标准。
参考资料:百度百科-c语言

#include "stdio.h"
#include
void main()
{
char *p,a[200],b[200];
int i,m;
p=a;
printf("
Enter a string:
");
gets(a);
m=strlen(a);
p=p+m-1;
for(i=0;i<m;i++)
{
b[i]=*p;
p--;
}
b[i]='\0';
printf("%s",b);
}

使用指针输出字符串有以下几种方式:

1、使用printf 函数进行输出,其使用的格式转换符为%s,如 

char *str = "test";//指针指向一个字符串

printf ("%s
", str);//输出str指向的字符串

2、使用puts函数进行输出,如

char *str = "test";

puts(str);//输出str指向的字符串,会自动多输出一个换行

3、使用自定义函数进行输出,如

void myPuts(char *str)//自定义输出函数

{

if (!str)return ;

while (*str != '\0'){

putchar(*str);

str++;

}

char *str = "test";

myPuts(str);

扩展资料:

C++指针与字符串

1、C语言里没有字符串数据类型,要想获得字符串的表示形式利用字符数组

#include<iostream>

using namespace std;

#include<stdlib.h>

void main()

{

char ar[]={'a','b','c','d'};

cout<<ar;   //字符串后无结束符\0,会有多余打印

cout<<endl;

char br[]={'a','b','c','d','\0'};

cout<<br;

cout<<endl;

char cr[5]="abcd";   //字符串结尾默认隐藏了\0

cout<<cr;

system("PAUSE");

}

2、C语言里没有字符串数据类型,要想获得字符串的表示形式利用字符指针

#include<iostream>

using namespace std;

#include<stdlib.h>

void main()

{

char *p="hello world";

cout<<p;   

//整形的指针,打印指针时只能打印其内部地址

//字符指针,打印指针时也是地址,但是这个被看作字符指针后,会打印该指针指向地址内存放的字符串,打印直到遇到\0为止

system("PAUSE");

}

3、静态常量区的字符串存储及指针访问

#include<iostream>

using namespace std;

#include<stdlib.h>

#include<string.h>

void main()

{

char *p="hello world";   //hello world存放在内存的静态常量区

//指针变量p存储的是该静态常量区的首个字符地址

//不能通过指针修改静态常量区的字符,但是可以通过指针访问

int length=strlen(p);   

//strlen计算的是字符串p的有效长度,不算\0

for(int i=0;i<length;++i)

{

cout<<p[i];

}

system("PAUSE");

}



1.*首先是一个算术运算符;

2. 定义一个指针,比方说下面的定义语句:

int a;

定义了一个变量a,其数据类型是int;

再看下面的定义语句:

int *b;

定义了一个int * 变量,怎样理解int*呢?可以这么来:

*b是int型的,它对应一个存储单元,里面可以存放int型数据,而这个单元的地址就存放在b中,此时b就是一个int *的数据. 于是,可以执行下面的操作

a=*b;

但是反过来这样操作就是错误的

b=a;

要用一个int型的变量给int *的变量赋值,则必须使用

b=&a;

讲到这,具有指针类型的形式参数的函数调用方法也就清楚了.

扩展资料:

*p=a的意思是将首元素的地址赋值给指针变量,在声明的时候完成了赋值。

由以上可以看出,p=&a[0],p=a,*p=a 三者的含义是一致的。

数组名a代表的就是数组地址,所以p=&a[0],p=a,二者是等价的。

声明时赋初值:

int *p=&a[0] 和 int *p=a是一致的。

通过指针引用数组元素时:a[1]=*(p+1)。

必须要注意的是:

a:数组首元素的地址(每个元素都是int类型)。

a+2:数组的第3个元素的地址。

* (a+2):数组的第3个元素的地址。

参考资料:百度百科-c语言字符串





一、字符指针

1、字符指针输出字符串

为了更好的理解这部分内容,我们先看一个例子:

#include <stdio.h>int main()


{    char *ps ;


ps = "C language!";     /*定义字符指针*/


printf("%s
", ps);  /*用字符指针PS来输出字符串的内容*/


return 0;

运行结果为: 

这个列子中,字符串“C language!”, 存储在连续的无名存储区中,通过语句ps = "C language!, 将无名储存区的首地址赋给指针ps,也就是说,指针变量ps 指向无名储存区域的首地址,而不是把无名储存区域的内容保存在ps中,

2、字符指针处理字符串

还是从具体的列子出发:

#include <stdio.h>

int main() 

{    

char *ps = "C language!";    

int n = 2;

ps = ps+2;      /*移动指针ps*/      

printf("%s
", ps);    

return 0;   


}

运行结果: 

这里初始化的时候把首地址赋给了ps , 后面操作ps= ps+2时,ps指向l 所在的空间。

3、字符数组与字符指针处理字符串有何不同

占用空间不同。数组所占空间取决于数组的长度,而指针只占用4字节,用以存放字符串的首地址。

赋值方式不同指针本身是变量,所以可以这样char *ps; ps = "C language!"; 赋值, 而数组不能这样char A[20];A = "C language!;赋值,而要逐个赋值。

二、指针数组

注意不要写成int (*p)[3]; 这是上一篇说的指向数组的指针变量,表示长度为3的指向一维数组的指针变量。

1、指针数组比较适合于用来指向若干个字符串,是字符串处理更加灵活方便。

2、比如图书馆有若干本书,要将这些书名存在一个数组中,一般的方法用二维数组来存,就得定义该字符数组的列数为最长书名的长度,这样就非常浪费空间。

3、用指针数组则可以让指针数组中的各个元素,指向各字符串(书名),这样排序时,不必改动字符串的位置,而是改动指针数组中个元素的指向。

4、这样,各字符串的元素可以不同,而且移动指针变量的值(地址),就比移动字符串所花的时间少得多。

运行结果: 


这段算法,后面部分与一般的数组差不多,但其效率却比较高。



可以直接用字符型指针指向一个字符串常量。

为了更好的理解这部分内容,我们先看一个例子:

#include <stdio.h>int main()


{    char *ps ;


ps = "C language!";     /*定义字符指针*/


printf("%s
", ps);  /*用字符指针PS来输出字符串的内容*/ 


return 0;


}

运行结果为:

这个列子中,字符串“C language!”, 存储在连续的无名存储区中,通过语句ps = "C language!, 将无名储存区的首地址赋给指针ps,也就是说,指针变量ps 指向无名储存区域的首地址,而不是把无名储存区域的内容保存在ps中,

代码截图:

参考资料:百度百科-网页链接

扩展资料:

在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。[1] 在高级语言中,指针有效地取代了在低级语言,如汇编语言与机器码,直接使用通用暂存器的地方,但它可能只适用于合法地址之中。指针参考了存储器中某个地址,通过被称为反参考指针的动作,可以取出在那个地址中存储的值。作个比喻,假设将电脑存储器当成一本书,一张内容记录了某个页码加上行号的便利贴,可以被当成是一个指向特定页面的指针;根据便利粘贴面的页码与行号,翻到那个页面,把那个页面的那一行文字读出来,就相当于是对这个指针进行反参考的动作。[2] 

在信息工程中指针是一个用来指示一个内存地址的计算机语言的变量或中央处理器(CPU)中寄存器(Register)【用来指向该内存地址所对应的变量或数组】。指针一般出现在比较接近机器语言的语言,如汇编语言或C语言。面向对象的语言如Java一般避免用指针。指针一般指向一个函数或一个变量。在使用一个指针时,一个程序既可以直接使用这个指针所储存的内存地址,又可以使用这个地址里储存的函数的值。



举个例子,下图代码.

#include <stdio.h>

int main()
{    char *ps ;
ps = "C language!";     /*定义字符指针*/
printf("%s
", ps);  /*用字符指针PS来输出字符串的内容*/
return 0;
}

输出为 "C language"

这个列子中,字符串“C language!”, 存储在连续的无名存储区中,通过语句ps = "C language!, 将无名储存区的首地址赋给指针ps,也就是说,指针变量ps 指向无名储存区域的首地址,而不是把无名储存区域的内容保存在ps中,

#include <stdio.h>

int main()
{    char *ps = "C language!";   

int n = 2;

ps = ps+2;      /*移动指针ps*/
printf("%s
", ps);  

return 0;  
}

这段代码输出结果为 language  

这里初始化的时候把首地址赋给了ps , 后面操作ps= ps+2时,ps指向l 所在的空间。




C语言中结构变量里指针成员的引用问题
{ char *name;...其中name作为字符串其长度未定义,虽然符合语法(指针本身就没有要求定义长度的)。对于这种未赋初值的字符串,需要定义一个有长度的数组。改成char name[20];我明白楼主的意思,是想定义一个长度不固定的字串,但是这是C,pchar类型的并不是严格意义上的串,建议使用C++中的string...

c语言指针变量中行指针和列指针是什么?要如何使用?
对于一个二维数组:int a[3][5];a即是它的行指针,a+0表示第0行的地址,a+1表示第1行地址…a[row]+col即列指针,列指针经过一次解引用就可以转化成二维数组中实际的值,列指针也是指向非常量的常量指针。

C语言程序中怎么用指针代替数组?谁能简单的举个例子说明一下。_百度知...
int a[3];int *p=&a;\/\/*(p+n)=a[n];int a[3][4];int *p;p=a[0];\/\/注意只能是这种格式;此指针指向的是列地址。\/\/*(p+11)=a[3][4];int *p[4];p=a;\/\/注意只能用这种格式,指向的是行地址。\/\/*(*(p+i)+j)=a[i][j];...

c语言怎么样把指针的值赋值给另一个指针
1. C语言 怎么把指针的值 赋给另一个数组 循环赋值, 或者直接strcpy。 因为这里是字符串。比如 include<stdio.h> int main(){ int i=0;char a[100];scanf("%s",a);fun(&a);return 0;} int fun(int *p){ int i,b,c,d;char j[100];strcpy(j, p);用memcpy也可以。memcpy(j, ...

谁能教教我pascal语言中的指针如何进行实际运用?
pascal语言中指针类型和动态数据结构 整型、实型、布尔型等各种简单类型和数组、记录、集合等各种结构类型的数据都属于静态类型的数据。所谓静态类型数据是指使用前必须在程序的说明部分给出描述这种数据的类型说明(TYPE语句)或变量说明(VAR语句),以定义这类数据占用内存空间的大小规模,使系统在程序的...

论述C语言中指针的概念和作用,并举例说明
p;\/*定义一个指针变量P*\/ p=&a;\/*让p指向a的首地址,也就是a的地址*\/ 程序为a分配一个2个字节的存储单元,假如2个字节的地址分别为(ABCD1和ABCD2,唯一),那么p里面放的值就是ABCD1,不是3。这时可通过p直接引用a,实际上*p=3。以后不管a存放在内存中的哪个地方,只用通过调用p就可以...

C语言菜鸟:如何用指针生成回文数组?
所谓回文数组,就是从高到底和从低到高遍历,得到的是相同序列。该数组具有对称性。如果一个数组不是回文数组,可以把对称位置上值不相等的元素修改为相等,来生成回文数组。用指针可以按照如下思路:1 定义两个指针head和end,head指向数组头,end指向数组尾。2 比较两个指针指向的值,如果不相等,则令...

亲,C语言中指针的定义和引用以及赋值时候“*”都表示什么含义啊_百度知 ...
在大多数计算机中,内存地址确实是以无符号整型数来表示的,而且多以16进制表示,但我们在C语言中不能用整型数去表示地址,只能用指针常量来表示,因为它是被用来赋给一个指针的。对于这个赋值问题还可以换一个角度去理解,在C语言中,使用赋值操作符时,赋值操作符左边和右边的表达式类型应该是相同的,...

C语言中,如何定义一个‘指针数组’,这个‘指针数组’专门用来存放‘数组...
指针数组定义int*p[n];[]优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+1时,则p指向下一个数组元素,这样赋值是错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来...

c语言编程:利用指针,向一整形数组a中输入数据并将数组a中的数据复制...
include <iostream> define n 10 int main(){ int a[n],b[n],i;for (i=0;i<n;++i)scanf("%d",&a[i]);b[i]=a[i];return 0;} 没看到要用指针 include <iostream> define n 10 int main(){ int a[n],b[n],*p=a,*q=b,i;for (i=0;i<n;++i){ scanf("%d",p);...

秀城区18237275297: c语言中如何借用指针输出字符串? -
扶傅氟尿: #include <stdio.h> #include <string.h> void sort(char * str[],int size) { int i,j; char * tmp; for(i=0;i<size-1;i++) { for(j=i+1;j<size;j++) { if(strcmp(str[i],str[j])>0) { tmp=str[i]; str[i]=str[j]; str[j]=tmp; } } } } void main() { char str[5][20]; char * p[5]; int i; for(i=0;i<5;i++) ...

秀城区18237275297: c语言 指针处理字符串(急!) -
扶傅氟尿: 2.如果某字母为这个字母在该字符串中第1,4,7次出现,保留 否则删去 能否说明白一点什么意思? 这个问题很简单!把字符串输入到一个数组a[10]中,第1,4,7次出现即a[0]、a[3]、a[6]中存放的字符. 每个字符都有一个ASCII码值,a——z的ASCII码值从97到122,A——Z的ASCII码值65到90. 查一下空格的ASCII码值就可以判断输入的是不是空格了...其它的字符也一样,比如,ASCII码值为97对应的字符是a........

秀城区18237275297: c语言 输入一个字符串,用指针实现从第一个字符开始,依次跳过一个字符输出该字符串. -
扶傅氟尿: 他们都太复杂了 #include <stdio.h> main() { char *p,a[100]; printf("请输入一个字符串:"); p=gets(a); while(*p) { putchar(*p); p+=2; } }

秀城区18237275297: C语言通过指针输出字符串
扶傅氟尿: main() { char x[10],i,*sp="asdfghj"; //scanf("%s",x); 这里不需要读入x for(i=0;*sp;i++) x[i]=*sp++; // 这里是把sp的内容复制给x x[i]='\0'; // 乱码的问题在这里!! printf("\n%s",x); getch(); }

秀城区18237275297: C语言字符串指针使用 -
扶傅氟尿: printf 中使用%s, 说明输出的是字符串,要求参数应该是 char *类型,而后会从该参数指向的位置开始输出,直到遇到'\0'为止.printf中使用%c,说明输出的是字符,这个时候参数是char类型,也就可以是*p,这时输出的是一个字符.

秀城区18237275297: c语言.通过字符指针变量输出一个字符串.谢谢 -
扶傅氟尿: for(i=0,i

秀城区18237275297: C语言 如何用指针输出字符串中间的字符? -
扶傅氟尿: #include"stdio.h" main() { int i=0; char a[ ]="abcdefg"; char *p=a; p+=2; for(i=0;i printf("%c",*p); p++; } system("pause"); }

秀城区18237275297: c语言指针字符串求解答以下程序怎么输出这个看不懂? -
扶傅氟尿: p = s;指针p指向字符数组s;指针变量p存储的值就是字符数组首地址,也就是字符'A'的地址,*p就是字符'A';q = s+6; 指针q指向字符数组的最后一个字符;指针变量q存储的是字符数组最后一个元素的地址,也就是字符'G'的地址,*q 就是字符'...

秀城区18237275297: c语言输入一串字符,输出字符长度用指针 -
扶傅氟尿:#include #includeint length(const char*); int main() { char str1[100],*p; // 这里应是char型int a;p=str1;gets(str1);a=length(p);printf("%d\n",a);return 0; }int length(const char*s) // 此函数也作了修改 {int len=0;for(;*s!='\0';s++) len++;return(len); }

秀城区18237275297: c语言中将字符串用指针数组输入输出.. -
扶傅氟尿: #include <string.h> // for strlen strcpy strcmp#include <stdio.h> // for printf scanf#include <stdlib.h> // for malloc char *strs[2];#ifndef strdup char *strdup(const char *src) // strdup 不是标准库函数, 不过大多数编译器上有实现 { int len; char *tmp = ...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网