精华内容
下载资源
问答
  • 但正解是:声明了一个字符指针后,并用字符串常量的第一个字符的地址赋值给指针变量a。即正确顺序是: 1.分配内存给字符指针; 2.分配内存给字符串; 3.将字符串首地址赋值给字符指针; 这里...

    对于语句  char *a="hello";

    对于这个声明方式,会造成的误解是:声明了一个字符指针(它会指向一个位置),将“字符串”赋值给 指针表达式"*a"所指向的地址。但正解是:声明了一个字符指针后,并用字符串常量的第一个字符的地址赋值给指针变量a。
    即正确顺序是:

    • 1.分配内存给字符指针;
    • 2.分配内存给字符串;
    • 3.将字符串首地址赋值给字符指针;

    这里有两点需要考虑清楚的地方:

    *a只是指向一个字符。举例如下:

    #include <iostream>
    #include <string>
    using namespace std;
    
    
    int main() {
    
        char *a ="abcdefg";
        cout << "输出字符: " << *a << endl;
        cout << "第二次输出字符: " << *(a+1) << endl;
        cout << "输出字符串: " << a << endl;
    
        return 0;
    }

    结果如下

    输出字符: a
    第二次输出字符: b
    输出字符串: abcdefg

     若字符串常量出现在在表达式中,代表的值为该字符串常量的第一个字符的地址。所以”hello”仅仅代表的是其地址。 
    原声明方式相当于以下声明方式:

    char *a;  
    a="hello";/*这里字符串"hello"仅仅代表其第一个字符的地址*/  

     

    1.但还是不明白为什么字符串可以赋值给字符指针变量

     

    char *p,a='5';
    p=&a;                     //显然是正确的,
    p="abcd";              //但为什么也可以这样赋值??

    双引号做了3件事:  
    1.申请了空间(在常量区),存放了字符串 
    2. 在字符串尾加上了'/0'    
    3.返回地址
    返回的地址,赋值给了指针变量p    

    2.以char *p = “hello”为例,把p换成数组,然后再赋值就不行了

    字符串常量"hello"出现在一个表达式中时,"hello"表达式使用的值就是这些字符所存储的地址(在常量区),而不是这些字符本身。

    所以,可以把字符串赋值给指向字符的指针p,而不能把字符串赋值给一个字符数组。

    char a[10] = “hello”; //这样可以,这种情况是c语言初始化所支持的

    如果写成char a[10]

    然后 a = “hello” 这样就错误了。

    因为同样是a数组,char a[10] = “hello”;这种是数组的初始化,和a[0] = ‘h’ a[1] = ‘e’…是一个道理

    但是换成char a [10],然后a = “hello”是不行的,“hello”赋值的值是一个地址,而a虽然也有地址,与指针不同,指针的值是地址,而数组的值虽然同为地址,却是一个常量,不能给常量赋值

    代码测试

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    int main() {
        char *p = "hello";
        cout << p << endl;
        char a[10];
        a = "hello";
        return 0;
    }

    报错 error C3863: array type 'char [10]' is not assignable

    而修改后,正常运行

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    int main() {
        char *p = "hello";
        cout << p << endl;
        char a[10] = "hello"; //数组初始化
        return 0;
    }

     

     

    字符数组,字符指针,字符串常量 知识回顾

    1.以字符串形式出现的,编译器都会为该字符串自动添加一个0作为结束符,如在代码中写 "abc",那么编译器帮你存储的是"abc\0"

    2."abc"是常量吗?
    1.当作为字符数组初始值的时候,"abc"不是常量

    char str[] = "abc";

    因为定义的是一个字符数组,所以就相当于定义了一些空间来存放"abc",而又因为字符数组就是把字符一个一个地存放的,所以编译器把这个语句解析为

    char str[4] = {'a','b','c','\0'};

    2.当赋值给 字符指针变量的时候:如char* ptr = "abc" 此时是常量

    char* ptr = "abc" //规范不允许这种c的写法

    规范写法

    const char* ptr = "abc";

    因为定义的是一个普通字符指针,并没有定义空间来存放"abc",所以编译器得帮我们 找地方来放"abc",显然,把这里的"abc"当成常量并把它放到程序的常量区是编译器 最合适的选择。简言之,如果char* ptr = "abc";写在函数体内,那么虽然这里的"abc\0"被 放在常量区中,但是ptr本身只是一个普通的指针变量,所以ptr(指针)是被放在上的, 只不过是它所指向的东西(值)被放在常量区罢了

    3.数组的类型是由该数组所存放的东西的类型以及数组本身的大小决定的

    如char s1[3]和char s2[4],s1的类型就是char[3],s2的类型就是char[4], 也就是说尽管s1和s2都是字符数组,但两者的类型却是不同的

    4.字符串常量的类型可以理解为相应字符常量数组的类型

    如"abcdef"的类型可以看成是const char[7]

    5.sizeof是用来求类型的字节数的。

    如int a;那么无论sizeof(int)或者是sizeof(a)都 是等于4,因为sizeof(a)其实就是sizeof(type of a)

    6.对于函数参数列表中的以数组类型书写的形式参数,编译器把其解释为普通 的指针类型

     

    void func(char sa[100],int ia[20],char *p) 
    
    则sa的类型为char*
    ia的类型为int*
    p的类型为char*

     

    7.根据上面的总结,来实战一下

    1)对于char str[] = "abcdef";就有sizeof(str) == 7,因为str的类型是char[7] str本身可变

    2)也有sizeof("abcdef") == 7,因为"abcdef"的类型是const char[7] 字符串常量

    3)对于char *ptr = "abcdef";就有sizeof(ptr) == 4,因为ptr的类型是char*,即

    
    
    #include <iostream>
    #include <string>
    using namespace std;
    int main() {
    
        char *p = "hello";
        cout << sizeof(p) << endl;  //4
        cout << sizeof(char *) << endl; //4
        return 0;
    }

     

    4)对于char str2[10] = "abcdef";就有sizeof(str2) == 10,因为str2的类型是char[10]

    5)对于void func(char sa[100],int ia[20],char *p);

     

    sizeof(sa) == sizeof(ia) == sizeof(p) == 4

     

    因为前面有说过编译器把数组类型的书写的形参,解释为普通的指针类型

    sa的类型是char*, ia的类型是int*,p的类型是char*

     

     

     

     

     

     

     

     

     

    对于C/C++中的 字符指针和字符数组,总是在碰到的时候无法确定而不得不现场测试,来确定末尾是否包含'\0',函数到底如何使用等等。真是劳民伤财,现在总结一下:

    字符指针的赋值

    (1)指向一个字符串常量

    char *src = "abcded"; //这种方式由系统自动给该字符指针指定了一个内存中的位置,并且该位置的字符数组为{'a', 'b', 'c', 'd', 'e', 'd', '\0'};

    如果此时再次对 src赋值,src = "mmmt", 则src指向另外一个由系统指定的内存块(由"mmmt"本身返回)。这种方式赋值的src为一个指向字符串常量指针,不能对src指向的位置的内容做改变的操作,即不能执行 *src = 'a', *(src+1) = 't' 等操作;但是可以改变src指向的位置,即像之前的 src = "mmmt";

    (2)指向一个字符数组

    char tmp[4] = {'a', 'c', 'e', 'f'};

    char* src = tmp;  

    (3)使用  new,然后可以像字符数组一样赋值,即指向一个字符数组

    char* src = new char[10]; //这种方式由程序在堆内存上开辟了一个数组,并将地址赋值给src

     

     

     

    字符串常量和字符数组比较

     

    (1)字符串常量由系统自动分配一个内存区域,且该区域中的内容不能改变(即无法通过指向该字符串的指针进行修改);

     

    (2)字符数组或者为系统自动分配的全局数据区或栈上的内存,或者通过new操作来分配的堆上的内存,字符数组中的内容可变(即可以通过指向该字符数组的指针进行修改)

     

    (3)字符数组中不默认含有'\0',除非明确赋值,而字符串常量在末尾自动含有 '\0'.

     

     

     

    strcpy的使用

    (1)用strcpy时候, 如果源字符串是一个字符指针,则没有问题,因为字符指针自动带'\0',在'\0'位置复制结束;

      而如果源是一个字符数组(即将字符数组转换为字符指针来使用),则将会从字符数组的首地址开始复制,如果字符数组中明确指定了'\0'元素,则会在'\0'处停止,而若没有'\0'元素,则程序可能会不停的复制,直到在程序的内存中碰到'\0',这样可能会得到不希望的结果。

     

    展开全文
  • 1.程序功能为输入5个字符串,使用库函数strcmp()比较字符串大小,由小到大排序并输出。下列程序 代码有错误,请修改为正确代码。 输入格式: 请输入5个字符串,字符串可以包含空格。 输出格式: 请输出排序后的字符串...

    最近事情有点多,问别人要了一份答案先放这,等闲下来再看看答案的缺点,写写解析吧。

    1.程序功能为输入5个字符串,使用库函数strcmp()比较字符串大小,由小到大排序并输出。下列程序 代码有错误,请修改为正确代码。

    输入格式:
    请输入5个字符串,字符串可以包含空格。
    输出格式:
    请输出排序后的字符串,每个字符串单独占一行。

    #include "stdio.h"
    #include "string.h"
        int main(  )
        {
            char ss[5][100],tt[100];
            int i,j;
            for(i=0;i<5;i++)
                gets(ss[i]);
            for(i=0;i<4;i++)
            {
                for(j=0;j<4-i;j++)
                {
                    if( strcmp(ss[j],ss[j+1])>0)
                    {
                       strcpy(tt,ss[j]);
                       strcpy(ss[j], ss[j+1]);
                       strcpy(ss[j+1],tt);
    
                     }
                }
            }
            for(i=0;i<5;i++)
                   puts(ss[i]);
    	   return 0;
        }
    

    2.“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。现在呢,就是让你判断输入的字符串是否是回文串。

    输入格式:
    输入一个字符串。
    输出格式:
    输出YES 或者 NO,最后换行。

    #include <stdio.h>
    int main()
    {
        char str[100];
        int i,j,flag=1,count=0;
        gets(str);
        while(str[count]!='\0')
        {
            count++;
        }
        for(i=0,j=count;(i<=count&&j>=0)&&(i<=j);i++,j--)
            if(str[i]!=str[j-1])
                flag=0;
        if(flag==0)
            printf("NO\n");
        if(flag==1)
            printf("YES\n");
        return 0;
    }
    

    3.给定程序的功能是:读入一个字符串,将该字符串中的所有字符按ASCII码升序排序后输出,请补足程序。

    输入格式:
    输入一个字符串
    输出格式:
    输出字符串,最后换行。

    #include <stdio.h>
    #include <string.h>
    int main()
    {
        char c,s[80];
        int i,j;
        gets(s);
        int count=0;
        while(s[count]!='\0')
            count++;
        for(i=0;i<count-1;i++)
        {
            for(j=0;j<count-1-i;j++)
            {
                if(s[j]>s[j+1])
                {
                    c=s[j];
                    s[j]=s[j+1];
                    s[j+1]=c;
                }
            }
        }
        printf("%s\n",s);
        return 0;
    }
    

    4.以下函数的功能为b中字符串连接到a字符串的后面,并返回a中新字符串的长度,补足程序。

    输入格式:
    输入两个字符串
    输出格式:
    第一行输出连接后的字符串,第二行输出字符串的长度,并换行。.

    #include <stdio.h>
    #include <string.h>
    int main()
    {
        char a[80],b[20];
        int num=0,n=0;
        gets(a);
        gets(b);
        while(a[num]!='\0')
            num++;
        while(b[n])
        {
            *(a+num)=*(b+n);
            num++;
            n++;
        }
        a[num]='\0';
        puts(a);
        printf("%d\n",num);
        return 0;
    }
    

    5.从键盘输入一行包含数字字符的字符串,计算并输出数字字符对应数值的累加和。

    输入格式:
    输入一行包含数字字符的字符串
    输出格式:
    输出数字相加的结果,最后换行。

    #include <stdio.h>
    #include <string.h>
    int main()
    {
        char a[80],t[80];
        memset(t,0,sizeof(t));
        int count=0,sum=0,flag=0,temp=0;
        int i=0,j=0,k=0;
        gets(a);
        while(a[count]!='\0')
            count++;
        for(int i=0;i<count;i++)
        {
            if(a[i]>='0'&& a[i]<='9')
          {
            flag=1;
            temp=a[i]-'0';
            if(flag==1)
            {
                t[k]=temp;
                k++;
            }
          }
            else
                   flag=0;
        }
        for(int i=0;i<=k;i++)
            sum+=t[i];
        printf("%d",sum);
        return 0;
    }
    

    6.请编写一个程序,功能是删除字符串中的所有空格。例如,输入"asd af aa z67",则输出为 “asdafaaz67”。

    输入格式:
    输入一个字符串,里面含有空格字符
    输出格式:
    输出删除空格字符后的字符串

    #include<stdio.h>
    #include<string.h>
    
    void deletespace(char *ch)
    {
    	char *s;
    	while (*ch != ' ')
    	{
    		if (*ch == '\0')
    			return;
    		ch++;
    	}
    	s = ch + 1;
    	while (s == ' ')
    		s++;
    	while (*s != '\0')
    	{
    		if (*s != ' ')
    		{
    			*ch = *s;
    			*s = ' ';
    			ch++;
    		}
    		s++;
    	}
    	*ch = '\0';
    	return;
    }
    int main()
    {
    	char ch[200];
    	gets(ch);
    	deletespace(ch);
    	printf("%s\n",ch);
    	return 0;
    }
    
    展开全文
  • 7。请问以下代码有什么问题: int main() { char a; char *str=&a; strcpy(str,”hello”); printf(str);...答案:没有为str分配内存空间,将会发生...虽然可以正确输出结果,但因为越界进行内在读写而导致程序崩溃

    7。请问以下代码有什么问题:

    int  main() { char a; char *str=&a; strcpy(str,”hello”); printf(str); return 0; }

    答案:没有为str分配内存空间,将会发生异常问题出在将一个字符串复制进一个字符变量指针所指地址。虽然可以正确输出结果,但因为越界进行内在读写而导致程序崩溃

    展开全文
  •  从键盘上读入一行字符,在屏幕上输出该行字符的长度及内容(先输出长度,后输出内容)。  注意:  (1)以回车表示行结束且回车不计入输入内容。若读入过程中发生错误或遇到文件结束,则也表示行输入结束。  (2)若...
    /*学校计算中心C语言题库的。。。。*/
    

    编写一程序P726.C实现以下功能
      从键盘上读入一行字符,在屏幕上输出该行字符的长度及内容(先输出长度,后输出内容)。
      注意:
      (1)以回车表示行结束且回车不计入输入内容。若读入过程中发生错误或遇到文件结束,则也表示行输入结束。
      (2)若用户输入时输入了很多字符,则仅读入前100个字符。
      (3)不能使用库函数gets、fgets、strlen或使用同名的变量、函数、单词。
      (4)编程可用素材:printf(“input a string: “)、printf(”\nThe string lenth is: …、printf(”\nThe string is: …。
      程序的运行效果应类似地如图1所示,图1中input a string: 123456 vdget 7u84,y37f部分之123456 vdget 7u84,y37f是从键盘输入的内容。

    在这里插入图片描述
    分析://从返回的错误信息来看,要保证ASCII码为255的字符也要能正确输入,char只支持到127,所以要定义int,承接getchar()的返回值,

    总结及发现:而定义int c,(char)c=getchar(),(char)(c=getchar()),
    前者是把getchar()的返回值赋给char类型的c,之后c的值不是getchar()的返回值;
    后者把返回值赋给c,c再强制转换为char,之后值仍然是getchar()的返回值
    s[i]=c;c超出char表示范围,在vc++6.0中实测c=255时,赋值后对应s[i]的值为-1,不影响系统判断此程序正确

    代码:
    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
    int c,i;
    char s[101];
    printf(“input a string: “);
    for(i=0;i<100;i++)
    if((c=getchar())!=’\n’ && c!=EOF)
    s[i]=c;
    else break;
    s[i]=’\0’;
    printf(”\nThe string lenth is: %d”,i);
    printf("\nThe string is: %s\n",s);
    return 0;
    }

    展开全文
  • 不使用strcpy函数,编程实现把b字符串复制到a中的程序(字符串长度限制在100个字符以内)。以下是部分代码,请完成并提交。 #include <stdio.h> int main(){ char a[100],b[100]; int i,j; gets(b);//输入字符...
  • 将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。 可以指定缓冲区的大小,或者接受默认的大小。在大多数情况下,默认值就足够大了。 该类提供了 newLine() 方法,它使用平台自己的...
  • 可以采用以下输出方式: 1、 puts(a); puts(b); //puts()函数自带换行 2、 printf("%s,%s", a, b); //在printf函数中a和b不加上中括号,此处表示的是数组首地址 不采用的输出方式: putchar(a, b); ...
  • 打开以下链接可以查看正确的代码 输入描述: 输入有两行,第一行n 第二行是n个空格隔开的字符输出描述: 输出一行排序后的字符串,空格隔开,无结尾空格 示例1 输入 复制 5 c d a bb e 输出 复制 a bb c d e #...
  • 【多选题】下列运算符的使用正确的有哪些( )【多选题】以下选项中,不符合 Python 语言变量命名规则的有( )【单选题】以下程序的输出结果是________ s = "python 编程 很 容易 学" print(len(s))【多选题】...
  • 来源:牛客网 ...对于每组测试用例,输出一行排序过的字符串,每个字符串通过空格隔开 示例1 输入 复制 a c bb f dddd nowcoder 输出 复制 a bb c dddd f nowcoder int main1() { string s; .
  • C语言中几个字符输出

    千次阅读 2013-06-02 14:35:05
    c语言中产生格式化输出的函数(定义在 stdio.h 中)。向终端输出(显示器等) 用法 int printf(const char *format,[argument]); format 参数输出的格式,定义格式为:%[flags][width][.perc][F|...
  • C语言控制台输出特殊字符都是问号? 用setlocale不行?你得用_setmode! 本人最近想写一个“将输入字符转换成 Unicode(UTF-16 BE)编码输出”的C语言控制台程序。 【1】英文字母、键盘符号:都很简单,这些都在...
  • 本文较为全面地总结了字符串的输入和输出,以及C++常用函数等知识内容,其中包括`对字符字符数组、字符串、字符串数组`、`字符串流的定义和输入输出的用法`,`对C/C++字符串的输入输出不同方法的使用和特性进行了...
  • 最近在项目中发现从文本文件中读取的QSTring类型字符串无法正确识别,经常是乱码输出,后来我发现用以下方法可以正确输出: 将QString转为char字符串 printf("%sn", (const char*)lineEdit2->text ().local8...
  • C++中的几种字符串输入输出方法

    万次阅读 多人点赞 2017-07-06 11:59:03
    c++中的字符串的几种输入与输出
  • /* 用递归法将一个整数n转换成字符串,例如输入483,应输出字符串”483“。n的位数不确定,可以是任意位数的整数*/int main(int argc, char *argv[]) { void convert(int n); int number; printf("input an ...
  • 以下选项中关于Java文件中输入输出的说法正确的是() A、在Java中,文件的输入输出功能是通过流来实现的 B、如果要把数据写入到一个文件中,需要创建一个输入流对象 C、字符流在某些方面比如汉字的处理,比字节流更...
  • printf数据输出语句和转义字符

    千次阅读 2010-08-11 15:01:00
    数据输出语句 本小节介绍的是向标准输出设备显示器输出数据的语句。在C语言中,所有的数据输入/输出都是由库函数完成的。 因此都是函数语句。本小节先介绍printf函数和putchar函数。printf函数printf函数称为格式...
  • Python 实践心得 —— 中英混杂的字符串对齐输出 第一次写技术博客,Python刚刚开始学习写的不好请多指教。 听说Python的爬虫很厉害,于是学习着第一次实践去爬了个起点网的网页下来。但是遇到了中英文的混排对齐...
  • 输入一行字符,统计其中字母、数字、空格、其它字符的数量,并输出到控制台package String;import java.util.Scanner;public class numbersCount {public static void main(String[] args) { // TODO 自动生成的方法...
  • C++与字符集、字符编码

    千次阅读 2019-11-02 10:50:06
    C++程序输出字符串的编码 字符串常量 参考文章 问题 字符集和编码往往是IT菜鸟甚至是各种大神的头痛问题。当遇到纷繁复杂的字符集,各种火星文和乱码时,问题的定位往往变得非常困难。本...
  • 题目描述 比较两个字符串s1和s2的大小,如果s1>s2,则输出一个正数;...“C”,应输出负数,同时由于"A"与"C"的ASCII码差值为2,因此应输出"-2"。同理:"And"和"Aid"比较,根据第2个字符比较的结果,“n"比"i...
  • 处理字符串的字符数组和字符指针

    千次阅读 2014-05-31 18:12:20
    我们知道,字符数组和字符指针都可以用来处理字符串,例如下面的两条语句都是正确的: char *p = "abc"; char a[4] = "abc"; 第二行代码大家都知道是正确的,下面我主要来解释一下第一行代码,第一行代码是将字符串...
  • atoi函数c语言中,atoi函数将字符串转变为数字,若遇到字母,就会停止输出#include #define Max_size 1024 #include <string.h>void atoi(char *a) { int temp = 0; int i = 0; int flag = 1; if(a[i] == '-') ...
  • 字符常量

    千次阅读 多人点赞 2017-10-13 14:21:01
    选择C 解析: 字符常量有两种: 一种是普通字符,即用单撇号括起来的一个字符,如'b' ,'y',‘?’。字符常量在储存在计算机的储存单元中时,是以...另外还可以用字符的ASCII码表示,即用反斜符(\)开头,后跟字符A
  • 从键盘输入BOY三个字符,然后把它们输出到屏幕。程序:#include<stdio.h>intmain(){chara,b,c;printf("请输入字符:");a=getchar();//注意getchar一次只能读入1个字符b=getchar();c=getchar();putchar(a);...
  • Problem A: 字符串类(I)

    千次阅读 2017-04-12 16:47:22
    Problem A: 字符串类(I) Time Limit: 1 Sec Memory Limit: 128 MB Submit: 3996 Solved: 1935 [Submit][Status][Web Board] Description 封装一个字符串类,用于存储字符串和处理的相关功能,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 227,390
精华内容 90,956
关键字:

以下能正确输出字符a