struct-error C2440:无法从“const char [5]”转换为char [20]”

问题描述

error C2440:无法从“const char [5]”转换为char [20]”


我想写一个根据输入即时查询的功能,但是这里报错了,

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
struct record
{
    char name[20];
    char number[20];
}NumberInfo[500];//通讯录列表
int NO;
int j;
FILE *fp;
void main(){
    NO=10;
    for(int i =0;i<10;i++){
         NumberInfo[i].name = "张三";//给联系人赋值
         NumberInfo[i].number="13701234567";

    }
    sort();
    find();

}
void sort()//排序
{
    int i,j;
    struct record s;
    int flag=1;
    for(i=0;i<NO-1&&flag;i++){
        flag=0;
        for(j=NO-2;j>=i;j--){
            if(strcmp(NumberInfo[j].name,NumberInfo[j+1].name)>0){
                s=NumberInfo[j];
                NumberInfo[j]=NumberInfo[j+1];
                NumberInfo[j+1]=s;
                flag=1;
            }
        }
    }
}

void find(){//查找
    char i;
    char shuru[20];
    j=0;
    printf("请输入你要查找的用户名n");
    if(scanf("%c",&i)!=''){//及时根据输入查询联系人
        shuru[j]=i;
        j++;
        found(shuru);
    }
}

void found(char s[]){
    for(int i=0;i<NO;i++){
        if(strstr(NumberInfo[i].name,s)!=NULL){
            printf("%s: %sn",NumberInfo[i].name,NumberInfo[i].number);
        }
    }
    printf("%s",s);
}

想问一下,这是什么问题?该怎么解决?

解决方案

http://codepad.org/dF7MCDHD

 #include<stdio.h>
#include<stdlib.h>
#include<string.h>
//#include<conio.h>
struct record
{
    char name[20];
    char number[20];
}NumberInfo[500];//通讯录列表
int NO;
int j;
FILE *fp;
void sort();
void find();
int main(){
    NO=10;
    for(int i =0;i<10;i++){
         char name[] = "张三";
         char telnum[] = "13701234567";
         strcpy(NumberInfo[i].name, name); //给联系人赋值
         strcpy(NumberInfo[i].number, telnum);
    }
    sort();
    find();

}
void sort()//排序
{
    int i,j;
    struct record s;
    int flag=1;
    for(i=0;i<NO-1&&flag;i++){
        flag=0;
        for(j=NO-2;j>=i;j--){
            if(strcmp(NumberInfo[j].name,NumberInfo[j+1].name)>0){
                s=NumberInfo[j];
                NumberInfo[j]=NumberInfo[j+1];
                NumberInfo[j+1]=s;
                flag=1;
            }
        }
    }
}
void found(char s[]);
void find(){//查找
    char i;
    char shuru[20];
    j=0;
    printf("请输入你要查找的用户名n");
    if(scanf("%c",&i)!=''){//及时根据输入查询联系人
        shuru[j]=i;
        j++;
        found(shuru);
    }
}

void found(char s[]){
    for(int i=0;i<NO;i++){
        if(strstr(NumberInfo[i].name,s)!=NULL){
            printf("%s: %sn",NumberInfo[i].name,NumberInfo[i].number);
        }
    }
    printf("%s",s);
}

解决方案二:

因为是局部变量,你得用参数或者全局变量才能传过来。找一本入门的书先学习下!

解决方案三:

在C语言中,不支持这种对数组的直接赋值,因为数组表示一段内存,而不是一个变量。所以需要使用相关的函数把字符串(同样对应着一段内存)的内容复制到该数组对应 的内存中,如:
strcpy(NumberInfo[i].name, "张三");
strcpy(NumberInfo[i].number, "13701234567");

若你的字符串不需要改变,可以使用char*(字符指针)来代替字符数组,如const char *name,这样就可以这样使用
name = "张三";
因为字符指针是一个指针变量,可以指向"张三"这一段的内存。

解决方案四:

NumberInfo[i].name = "张三";
NumberInfo[i].number = "13701234567";
应当变成:
strcpy(NumberInfo[i].name, "张三");
strcpy(NumberInfo[i].number, "13701234567");

解决方案五:

#include
#include
#include
#include
struct record
{
char name[20];
char number[20];
}NumberInfo[500];
int NO;
FILE fp;
int loadfile();
void savefile();//保存
void menu();//菜单
void found();//创建
void modifymenu();//修改
void deleted();//删除
void display();//显示
void find();//查找
void main()
{
loadfile();
while (1)//////////////
menu();
}
int loadfile()/
创建文件、读取文件*/
{
FILE fp;
if((fp=fopen("NumberInfo.txt","r"))==0)
{
printf("nnnnnttt电话簿文件不存在");
if((fp=fopen("NumberInfo.txt","wb"))==0)//////////////////////////以二进制读取方式打开文件NumberInfo.txt
{
printf("ntttt建立失败");
exit(0);
}
else
{
printf("nnttt电话簿已建立");
printf("nnttt按任意键进入主菜单");
getch();/////////////////////////不回显读取函数,无需回车
NO=0;
return(NO);
}
exit(0);///////////////////////////////////////
}
fseek(fp,0,2);/
从NumberInfo.txt文档中导入联系人(将当前指针移动到文件尾偏移0字节处)*/
if(ftell(fp)>0)
{
rewind(fp);
for(NO=0;!feof(fp)&&fread(&NumberInfo[NO],sizeof(struct record),1,fp);NO++);//feof()函数判断指针是否已到达文件尾,是返回1;fread()函数是读取文件内容到NumberInfo【】中;
printf("nnnnn");
printf("ntt文件导入成功!");
printf("nntttt按任意键返回主菜单");
getch();
return(NO);
}
else
{
printf("ntt没有可以访问的数据!");
printf("nnttt按任意键返回主菜单进行添加");
getch();
NO=0;
return(NO);
}
}
void menu()/*主菜单*/
{
int choice;
system("cls");/*清屏*/
printf("nnt********************欢迎使用通讯录系统***********************n");
printf("ntt *********创建通讯录请按:1**********n");
printf("ntt *********显示通讯录请按:2**********n");
printf("ntt *********修改通讯录请按:3**********n");
printf("ntt *********查找通讯录请按:4**********n");
printf("ntt *********退出通讯录请按:5**********n");
printf("nt *********************这是通讯录的主菜单************************n");
printf("nntt请输入你的选择[]bb");
scanf("%d",&choice);
switch (choice)
{
case 1:found();break;
case 2:display();break;
case 3:modifymenu();break;
case 4:find();break;
case 5:system("cls");
printf("nnnnnnntt 谢谢使用此通讯录管理系统!nnnnnnnnnnnnnn");
exit(0);
default :menu();
}
}
void found()/*创建通讯录*/
{
system("cls");
printf("ntt********************请输入联系人信息**************************n");
printf("ntt输入姓名:");
scanf("%s",&NumberInfo[NO].name);
printf("ntt输入电话号码:");
scanf("%s",&NumberInfo[NO].number);
NO++;
savefile();
printf("ntt是否继续添加?(y/n):[]bb");
if (getch()=='y')
found();
else
system("cls");
printf("nnnnnnnnttt已成功保存所有联系人nnttt请按任意键返回主菜单");
getch();
}
void savefile()/*保存通讯录*/
{
int i;
if ((fp=fopen("NumberInfo.txt","wb"))==0)
printf("ntt文件打开失败!n");
for(i=0;i<NO;i++)
if(fwrite(&NumberInfo[i],sizeof(struct record),1,fp)!=1)
printf("ntt写入文件错误!n");
fclose(fp);
}
void display()/*显示通讯录*/
{
int i;
system("cls");
if(NO!=0)
{
printf("ntt*****************以下为通讯录所有信息*******************");
for(i=0;i<NO;i++)
{
printf("nntt%d",i+1);
printf("ntt姓名: %s",NumberInfo[i].name);
printf("ntt电话号码: %s",NumberInfo[i].number);
}
printf("ntt********************************************************");
printf("nnttt 请按任意键返回主菜单进行添加");
getch();
menu();
}
else
{
printf("nnnnnnnnnttt该通讯录暂无信息");
printf("nnttt 请按任意键返回主菜单进行添加");
getch();
menu();
}
}
void modifymenu()/*修改通讯录*/
{
int mark=0;
int i,k;
int a=0;
int t=0;
char choice;
char name[20];
struct record modify;
system("cls");
if(NO!=0)
{
printf("nnntt以下为所有联系人姓名:nn");
printf("tt********************************************************nn");
for(i=1;i<=NO;i++)
{
printf("tt%sn",NumberInfo[i-1].name);
}
printf("ntt*******************************************************n");
printf("ntt请输入您要修改的姓名:");
scanf("%s",name);
system("cls");
for(i=a;i<NO;i++)
{
if(strcmp(NumberInfo[i].name,name)==0)
{
k=i;
mark=1;
modify=NumberInfo[i];
system("cls");
printf("ntt***********以下是您将修改的联系人信息************");
printf("nntt姓名:%s",NumberInfo[i].name);
printf("ntt联系电话: %s",NumberInfo[i].number);
printf("nntt是否继续?(y/n)[]bb");
if (getch()=='n')
menu();
else
{
printf("ntt选择您要修改的选项:");
printf("nntt(1)姓名");
printf("nntt(2)电话号码");
printf("nntt(3)返回nn");
choice=getch();
switch(choice)
{
case'1':printf("ntt请输入姓名:");
scanf("%s",NumberInfo[i].name);
break;
case '2':printf("nttt请输入联系电话:");
scanf("%s",&NumberInfo[i].number);
break;
case '3':modifymenu();
break;
default:modifymenu();
}
system("cls");
printf("ntt您的修改结果为:");
printf("nntt 姓名: %s",NumberInfo[i].name);
printf("ntt电话号码: %s",NumberInfo[i].number);
printf("nntt确认修改?(y/n)[]bb");
if(getch()=='n')
{
NumberInfo[i]=modify;
printf("ntt修改未保存!n");
}
else
{
printf("ntt修改成功!n");
savefile();
}
mark++;
printf("ntt是否继续修改?(y/n)[]n");
if(getch()=='y')
modifymenu();
else menu();
}
}
}
}
if(mark==0)
{
printf("nnntttt没有该联系人的记录");
printf("nntttt是否继续修改?(y/n)[]bb");
if(getch()=='y')
modifymenu();
}
else
{
printf("nnnnnnnnnttt通讯录中无任何记录");
printf("nnttt 请按任意键返回主菜单进行添加");
getch();
menu();
}
}
void deleted()/*删除联系人*/
{
int i,j;
int mark=0;
char name[20];
system("cls");
if(NO!=0)
{
printf("nnntt以下为所有联系人的姓名:nn");
printf("tt*****************************************************nn");
for(i=1;i<=NO;i++)
{
printf("tt%sn",NumberInfo[i-1].name);
}
printf("ntt****************************************************n");
printf("ntt请输入要删除的联系人的姓名:");
scanf("%s",name);
system("cls");
for(i=0;i<NO;i++)
{
if(strcmp(NumberInfo[i].name,name)==0)
{
printf("ntt以下是您要删除的联系人记录:");
printf("nntt姓名: %s",NumberInfo[i].name);
printf("ntt电话号码: %s",NumberInfo[i].number);
printf("nntt是否删除?(y/n)[]bb");
if(getch()=='y')
{
for (j=i;j<NO-1;j++)
NumberInfo[j]=NumberInfo[j+1];
NO--;
mark++;
printf("ntt删除成功n");
savefile();
printf("ntt是否继续删除?(y/n)[]bb");
if (getch()=='y')
deleted();
else
menu();
}
else
menu();
}
continue;
}
if (mark==0)
{
printf("nnntttt没有该联系人记录");
printf("nntttt是否继续修改?(y/n)[]bb");
if(getch()=='y')
deleted();
}
}
else
{
printf("nnnnnnnnnttt 通讯录中无任何记录");
printf("nntt 请按任意键返回主菜单进行添加");
getch();
menu();
}
}

void find(){
int i,j;
i=0;
char shuru[20];
printf("请输入你要查找的用户名n");
if(scanf("%c",&shuru[i])!=''){//及时根据输入查询联系人
i++;
for(int j=0;j<NO;j++){
if(strstr(NumberInfo[j].name,shuru)!=NULL){
printf("%s: %sn",NumberInfo[j].name,NumberInfo[j].number);
}
}
printf("%s",shuru);
}
}


请问为什么这样还是不行?

解决方案六:

sort,find函数需要前置申明,不然main调用的时候找不到。

时间: 2016-01-14

struct-error C2440:无法从“const char [5]”转换为char [20]”的相关文章

编程c语言-c语言指针问题 char *p=&amp;amp;quot;abcdefg&amp;amp;quot;+1; 为什么会报错,const char*无法转换为char*

问题描述 c语言指针问题 char *p="abcdefg"+1: 为什么会报错,const char*无法转换为char* char p="abcdefg"+1: 为什么会报错,const char无法转换为char* 解决方案 abcdefg是const 不能直接加一 解决方案二: 我想我知道了,字符串是const的对象所以指向他的指针也必须用const修饰,但这样又有个问题了char* p="ddd":为什么就可以呢?"ddd&q

C2440: “delete”: 无法从“std::string”转换为“void*”

问题描述 C2440: "delete": 无法从"std::string"转换为"void*" #include ""stdafx.h""#include #include using namespace std;class A{public: virtual ~A() { cout << ""call A::~A()"" << endl;

c++的问题- error C2440: “默认参数”: 无法从“const char [7]”转换为“std::string &amp;amp;amp;”

问题描述 error C2440: "默认参数": 无法从"const char [7]"转换为"std::string &" 代码如下: 1 #include 2 using namespace std; 3 class Student{ 4 string name; 5 public: 6 Student(string& n ="noName") :name(n){} 7 }; 8 class Teache

char *str 与char str[] 的区别

简述 char *str = "abcd" 先在静态区为"hello"常量分配5Byte,接着在栈里为指针str分配4Byte(32位机器)并指向"abcd"字串的首地址,因此此时str是指向第一个字符'a'的一个指针. char str[ ] = "abcd" 在栈里分配连续的5Byte,内容为'a','b','c','d','\0',并把首地址标记为str,此时str是数组名,同时也是指向数组第一个字符'a'的指针常量.

struct-const CString 转换为char* 内容丢失

问题描述 const CString 转换为char* 内容丢失 LPCTSTR lpszText = (LPCTSTR)sHostName; struct hostent FAR *lpHostEnt = gethostbyname(LPSTR(lpszText)); if (lpHostEnt == NULL) { sIPAddress = _T(""); return WSAGetLastError(); } 解决方案 参考:http://blog.sina.com.cn/s/b

char str[] 与 char *str的区别详细解析_C 语言

复制代码 代码如下: char* get_str(void)  {      char str[] = {"abcd"};      return str;  } char str[] = {"abcd"};定义了一个局部字符数组,尽管是数组,但它是一个局部变量,返回它的地址肯定是一个已经释放了的空间的地址. 此函数返回的是内部一个局部字符数组str的地址,且函数调用完毕后 此数组被销毁,所以你返回的指针也就指向一块被销毁的内存,这种写法是错误的. 复制代码 代码如

【C#遗补】之Char.IsDigit和Char.IsNumber的区别

原文:[C#遗补]之Char.IsDigit和Char.IsNumber的区别 Char中IsDigit和IsNumber的两个方法都是用来判断字符是否是数字的,那他们有什么区别 IsDigit        判断的是十进制数字,就是 '0 '.. '9 '. IsNumber   判断的是数字类别,包括十进制数字 '0 '.. '9 ',还有用字母表示的数字,如表示罗马数字5的字母 'V ',还有表示其他数字的字符,如表示"1/2"的字符.

基于C语言char与unsigned char的区别介绍_C 语言

在C中,默认的基础数据类型均为signed,现在我们以char为例,说明(signed) char与unsigned char之间的区别. 首先在内存中,char与unsigned char没有什么不同,都是一个字节,唯一的区别是,char的最高位为符号位,因此char能表示-127~127,unsigned char没有符号位,因此能表示0~255,这个好理解,8个bit,最多256种情况,因此无论如何都能表示256个数字. 在实际使用过程种有什么区别呢?主要是符号位,但是在普通的赋值,读写文

浅析char 指针变量char *=p 这个语句的输出问题_C 语言

学习指针的时候我一直有个疑惑,请看下面的代码: #include <iostream> using std::cout; void main() { int num=5; int *nPtr=&num; cout<<nPtr;//输出指针的地址.但是会报错<<没有直接输出int *地址的功能 return ; } 但是,将int 改成char 类型就不会报错,可以输出字符串.同样是指针,这次为何没有输出地址(理应输出指针代表的地址,但是<<并没有重载