C语言打印字符串的一部分的方法
你现在要使用的是printf()函数,而不是sprintf()函数。请看下例:
#
include
#
include
void
main
(void);
void
main
(void)
{
char
*
source_str
=
“THIS
IS
THE
SOURCE
STRING”
;
/
*
Use
printfO
to
the
first
11
characters
of
source_str.
*
/
printf(“First
11
characters:
‘
%11.
lls’\n”
,
source_str);
/
*
Use
printf()
to
only
the
last
13
characters
of
source
_str.
*
/
printf(“Last
13
characters:’%13.13’\n”,
source_str+(strlen(source_str)-13));
}
上例的打印输出如下所示:
First
11
characters:
‘THIS
IS
THE’
Last
13
characters:’SOURCE
STRING’
在上例中,第一次调用printf()函数时,通过指定参数”%11.11s”,迫使printf()函数只打印11个字符的长度,因为源字符串的长度大于11个字符,所以在打印时源字符串将被截掉一部分,只有头11个字符被打印出来。第二次调用printf()函数时,它将源字符串的最后13个字符打印出来,其实现过程为:
(1)用strlen()函数计算出source_str字符串的长度,即strlen(source_str)。
(2)将source_str的长度减去13(13是将要打印的字符数),得出source_str中剩余字符数,且pstrlen(source_str)-13。
(3)将strlen(source_str)-13和source_str的地址相加,得出指向source_str中倒数第13个字符的地址的指针;即source_str+(strlen(source_str)-13)。这个指针就是printf()函数的第二个参数。
(4)通过指定参数“%13.13s”,迫使printf()函数只打印13个字符的长度,其结果实际上就是打印源字符串的最后13个字符。
在C语言中如何实现用键盘输入一个字符串,并打印出来?
在C语言中输入字符串后然后打印出来的编程方法如下:
1.首先需要先定义一个存放字符串的数组空间,如给字符串100个数组空间。
2.接着使用gets()函数来获取键盘输入的字符串。一般格式为gets(定义的字符数组名)。
3.然后再使用puts()函数来输出之前输入的字符串内容。一般格式puts(定义的字符数组名)。
4.最终运行程序,即可成功实现输入字符串,然后原样在屏幕中输出字符串。
扩展资料:
1.gets从标准输入设备读字符串函数,其可以无限读取,不会判断上限,以回车结束读取,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。
2.puts()函数用来向标准输出设备(屏幕)输出字符串并换行,具体为:把字符串输出到标准输出设备,将’\0’转换为回车换行。其调用方式为,puts(s);其中s为字符串字符(字符串数组名或字符串指针)。
参考资料:
百度百科-gets
百度百科-puts
C语言——字符串的地址
c语言中的字符串,我在以前都一直以为是常量(自己学习不精),实际上字符串在赋值给char*的时候是系统现在内存中开辟一段空间,把字符串的内容存入内存中,再把地址赋给char *。
例如这样:
程序段:
程序运行结果:
解释:
我们通过定义了一个变量,例如:int a; 实际上是系统为程序开辟了一段属于变量 a 的内存空间,假设内存地址为aaaaa。我们改变 a的值,比如 本来a=5; 实际上是向内存中的地址为aaaaa的内存空间存入了5的数值,后来的程序句中变成 a=6; 实际上是把内存中的地址为aaaaa的内存空间中存有的5改成了6。我通过指针 int *b=a; 将b指向a后,通过 *b=6 ,来改变a,实际上a也等于6,实际上也就是aaaaa内存空间的5变成了6。
这时候问题来了,既然字符串在出现的时候会让系统开辟内存空间并且将字符串的数值存入这个内存空间,那我是否能够通过指针来改变这一段内存空间的内容呢?
如果是普通的
char *a=”abcd”;
a=”bcde”;
这样的话,也就是先把a指向”abcd”然后再把a指向”bcde”而已了。
但是我想这样:
char *a=”abcd”;
*a=”bcde”;
呢?
答案是不行,编译器不会报编译错误,但是在程序运行的时候就会出错。
程序运行到*a=”bcde”; 时就卡住,然后非正常退出了。
也就是我们无法通过 向*a赋值一个字符串 这种方式来改变原本存有”abcd”的那一段内存中的内容。
但是书上说到了:
可以通过改变字符串中的一个字符,并且不通过*pl输出,通过直接输出”Klingon”(因为”Klingon”就代表了它所在的那一段内存,就像int a中的变量a代表了a所在的那一段内存) 看到原本的”Klingon” 变成了”Flingon”,也就是内存中连续存放着的’K”l”i”n”g”o”n’中的’K’被改变成了’F’,变成了’F”l”i”n”g”o”n’。书上也说明了:”实际上在过去,一些编译器由于这方面的原因,其行为难以捉摸,而另一些编译器则导致程序异常中断。”
当我调用”Klingon”这个字符串时候,全局程序都会使用同一个内存中的字符串。如果你通过某个指针上改变了”Klingon”的值,也就是改变了”Klingon”这个字符串内存中的数值,会使得之后的程序调用”Klingon”字符串时,会变成”Flingon”或者是其他的什么。所以系统保护字符串常量不能被修改。
通过书上的例子进行修改:
结果:
直接用指针修改会导致 Segmentation fault 错误,对内存的错误访问
应该是字符串被当做常量,存放在内存常量区由系统保护,所以无法改变
c语言—-与const常量有关的内存分配
c语言问题,字符串打印问题
#include stdio.h
#include string.h
#include ctype.h
#define LENGTH 20
int findFirst(char, const char *);
int main(void)
{
char str[LENGTH];
int i, temp;
gets(str);
for (i = 0; i strlen(str); i++)
{
if (!isalpha(str[i])) //判断是否为字母
continue;
temp = findFirst(tolower(str[i]), str); //统一转换为小写判断
if (temp == i) //判断字母是否为第一次出现
if (i == 0)
printf(“%c %d”, str[i], i + 1);
else
printf(“,%c %d”, str[i], i + 1);
}
return 0;
}
int findFirst(char toFind, const char *str) //查找第一次出现位置
{
int location;
for (location = 0; tolower(str[location]) != toFind; location++);
return location;
}
c语言 怎么将字符串中的地址取出其内存输出
字符串是一连串地址连续的内存空间,每个地址对应字符串元素的地址。
我们一般说的字符串的地址,就是指字符串首元素的地址。
比如:char
str[10];这样的数组。它的地址就是其str[0]的地址。
所以可以表示为str,或者str[0]。
如果说取其他元素的地址,str[对应下标]就可以了。
因为地址连续,定义指针接收,还可以通过指针加减获取对应元素地址。
比如char
*p=str[2];(我们让指针指向第3个元素地址),那么p++;p就是指向了第4个元素地址。同理p–;就指向第2个元素地址。
注意,数组名str,可以表示数组首地址,但其本身是常量指针,不能赋值。
另外打印地址,可以用格式%p