精华内容
下载资源
问答
  • C语言里scanf读入字符串时的小问题 原来对于字符指针和字符数组的区别很模糊 无意间尝试用scanf读入未初始化的字符指针报了段错误 char *str1, *str2; scanf("%s", str1); scanf("%s",str2); 原因: 字符指针如果...

    C语言里scanf读入字符串时的小问题

    原来对于字符指针和字符数组的区别很模糊
    1、无意间尝试用scanf读入未初始化的字符指针报了段错误

    char *str1, *str2;
    scanf("%s", str1);
    scanf("%s",str2);
    

    原因:

    字符指针如果没有像这样

    char *str1 = "abcdef"//str1指向的是字符串常量池的地址
    

    显式地进行初始化

    或者没有用malloc分配堆内存空间
    则字符指针是指向的不确定内存空间(随机值),scanf也就无法进行正常读入,从而造成非法访问内存(段错误)

    2、如果用scanf读入字符数组当中,没有限制读取字符的最大长度(个数),scanf就会在遇到空白符(\n、\t…)之前一直将字符读入输入缓冲区中,超过了字符数组的长度,可能会发生非法访问以及其他未知的错误。

    例如:

    char str[21];
    main(){
    	//不限制字符读入的个数,遇到空白符之前,不管字符数组的长度,全都读入字符数组中
    	scanf("%s", str);//scanf("%20s", str);
    	printf("%s", str);
    }
    

    以上代码,如果读取的字符个数超过字符数组的长度,scanf仍然会继续读入下去,这可能造成
    1、可能的非法访问(段错误)
    2、如果运行正常,printf也会输出所有之前读入的字符(printf输出字符串也是遇到 ’ \0 ’ 字符才停止输出),与预期的最多只输出20个字符的期望不符。

    原因:
    C语言在读入字符数组时,不保存字符数组的长度信息(C++中的cin就没有这样的问题),读入的数据长度由程序员规定,否则就会出现诸如缓冲区溢出,从而导致安全问题。

    基础不牢,地动山摇,继续努力

    展开全文
  • //用scanf读入字符串、单个字符、数字的区别 //二位数组的降维读入,十分便捷 #include<stdio.h> #include<string.h> void main(){ int n; while(~scanf("%d",&n)&&n){//会在缓冲区留下一...

    //用scanf读入字符串、单个字符、数字的区别
    //二位数组的降维读入,十分便捷

    #include<stdio.h>
    #include<string.h>
    void main(){
    	int n;
    	while(~scanf("%d",&n)&&n){//会在缓冲区留下一个换行符
    	//	getchar();不需要它的原因③
    		char b[1005][20];
    		int max=0,maxi,i,j,count;
    		for(i=0;i<n;i++){
    			scanf("%s",b[i]);//即使前面没有getchar,由于类型是字符串,不会读取前面的getchar,下面一个同理
    		//	getchar();不需要它的原因③
    		}
    		for(i=0;i<n;i++){
    			count=0;
    			for(j=0;j<n;j++)
    				if(strcmp(b[i],b[j])==0) count++;
    			if(count>max) {max=count;maxi=i;}
    		}
    		printf("%s\n",b[maxi]);
    	}
    }
    

    总结
    //使用scanf("%c",&c)读取c(c是char类型),如果读取之前有换行符或空格,那么c就会把之前的缓冲区的换行符或空格读入,解决方法是,在这之前先getchar()一下;
    //如果用scanf("%s",str)读取str(char str[]或char str[][]),哪怕缓冲区有换行符或空格,也不会读取;
    //其他数值类型是没有这样的问题的。

    #include<stdio.h>
    #include<string.h>
    void main(){
    	int repeat;
    	scanf("%d",&repeat);
    	getchar();//用getchar()的原因①
    	while(repeat--){
    		char s[1000],c;
    		gets(s);
    		//不用加getchar()的原因②
    		scanf("%c",&c);
    		getchar();//用getchar()的原因①
    		printf("result: ");
    		for(int i=0;i<strlen(s);i++){
    			if(s[i]==c) continue;
    			else printf("%c",s[i]);
    		}
    		printf("\n");
    	}
    }
    

    总结
    //接收前:③scanf("%s",s)接收字符串自动舍弃缓冲区回车符,①但是gets(s)会接收缓冲区的回车符;
    //接收后:②gets(s)会舍弃用来结束输入的回车符,④scanf("%s",s)会在缓冲区留下回车符;

    //scanf 以space、enter、tab结束一次输入,不会舍弃最后的结束符(残留在缓冲区);
    //getchar 以enter结束输入,不会舍弃最后的结束符(残留在缓冲区);
    //gets 以enter结束输入,会舍弃enter。

    展开全文
  • scanf读入字符串的方法

    千次阅读 2019-07-21 16:31:36
    1、使用cin读入n再scanf读入二维字符数组 (每一个都用字符读入) #include<iostream> #include<string> #include<stdio.h> using namespace std; int main(){ int n; cin>>n;//这里如果...

    1、使用cin读入n再scanf读入二维字符数组

    (每一个都用字符读入)

    #include<iostream>
    #include<string>
    #include<stdio.h>
    using namespace std;
    
    int main(){
        int n;
        cin>>n;//这里如果是scanf("%d",&n),也要用getchar
        char ch;
        char c[100][100];
        for(int i=0;i<n;i++){
            getchar();//getchar消去回车
            for(int j=0;j<n;j++){
                scanf("%c",&c[i][j]);
            }
        }
    
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                cout<<c[i][j]<<' ';
            }
            cout<<endl;
        }
        return 0;
    }
    

    2、读入string形式字符串

    #include<iostream>
    #include<string>
    #include<stdio.h>
    using namespace std;
    
    int main(){
        int n;
        cin>>n;
        //getchar();这里加不加getchar都可以
        string s;
        cin>>s;
        cout<<s;
        return 0;
    }
    

    3、scanf读入二维字符数组

    #include<iostream>
    #include<string>
    #include<stdio.h>
    using namespace std;
    
    int main(){
        char s[100][100];
        int n;
        cin>>n;
        getchar();
        for(int i=0;i<n;i++){
            scanf("%s",&s[i]);
        }
    
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                cout<<s[i][j]<<' ';
            }
            cout<<endl;
        }
    
    }//scanf读取二维数组
    

    4、scanf读入字符串

    #include<iostream>
    #include<string>
    #include<stdio.h>
    using namespace std;
    
    int main(){
        char s[100];
        char ch[100];
        scanf("%s%s",&s,&ch);//遇到空格会跳出
        printf("%s %s",s,ch);
        return 0;
    }
    

    在这里插入图片描述

    5、scanf读入二维字符数组(每一行用字符串读入)

    #include<iostream>
    #include<string>
    #include<stdio.h>
    using namespace std;
    
    int main(){
        char ch[100][100];
        int n;
        cin>>n;//这里如果用scanf("%d",&n),getchar用不用都可以,使用cin也可以不用getchar
        getchar();
        for(int i=0;i<n;i++){
            //如果用scanf或者cin,这里加不加getchar都可以
            scanf("%s",&ch[i]);
        }
        for(int i=0;i<n;i++){
            cout<<ch[i]<<endl;
        }
        return 0;
    }
    

    6、getline读入一行(可以有空格)

    #include<iostream>
    #include<string>
    #include<stdio.h>
    using namespace std;
    int main(){
      string s;
      int n;
      cin>>n;
      getchar();
      getline(cin,s);//读入一行
      cout<<s<<endl;
      getline(cin,s);
      cout<<s<<endl;
      return 0;
    }
    

    在这里插入图片描述

    展开全文
  • C语言---关于scanf读入字符串的一些问题

    万次阅读 多人点赞 2015-05-11 15:10:10
    但是有一类问题通常令人头疼,那就是字符串的读入,此处仅仅讨论使用scanf读取字符串的一些问题。 理论上你只需要定义一个字符指针,然后scanf每次读入字符存储到该指针所指的存储空间,之后指针值自动加1. 所以,...
    scanf是C语言中常用的标准输入输出函数,它的常规用法是scanf(“输入格式”,输入地址),scanf从输入缓冲区取入数据按照指定的“输入格式”存储到指定的“输入地址”。
    但是有一类问题通常令人头疼,那就是字符串的读入,此处仅仅讨论使用scanf读取字符串的一些问题。
    理论上你只需要定义一个字符指针,然后scanf每次读入字符存储到该指针所指的存储空间,之后指针值自动加1.
    所以,我们就有了下面两种读入字符串的办法:
    

    1.定义字符数组

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void) {
        // your code goes here
        char str[20];
        scanf("%s",str);
        printf("%s",str);
        return 0;
    }
    

    完美运行,但是得说明一点,这里的字符数组必须事先确定好长度,即得事先吧内存开辟好,不然运行肯定会出错。
    2.定义字符指针

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void) {
        // your code goes here
        char* str;
        scanf("%s",str);
        printf("%s",str);
        return 0;
    }
    

    scanf既然可以在每次读入一个字符之后,自动为指针+1,那么我们自然而然就想到其实我们是可以定义一个字符指针,然后scanf就往这个字符指针中读取字符,但是其实不然,运行一下就会发现这种情况是错误的,为什么呢?
    因为我们没有为scanf输入的指针申请存储空间,scanf输入的数据必须也只能存放到实现申请好的存储空间,不然输入的字符可能会覆盖掉代码段或者其他一些地方的数据,引发未知的错误。
    现在我们就试一试事先申请内存:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void) {
        // your code goes here
        char* str=(char*)malloc(15*sizeof(char));
        scanf("%s",str);
        printf("%s",str);
        return 0;
    }

    完美运行。
    简单总结一下,那就是如果要使用scanf读入字符串,那就一定要事先为它申请足够的内存空间。

    展开全文
  • scanf读入字符串与读入字符的区别

    万次阅读 2014-03-30 18:03:03
    1、使用scanf("%c", &a)读取a(a是char类型),如果读取之前有换行符或者空格,那么a就会把之前的换行符或者空格读取到,解决方法就是这之前先getchar()一下。 2、而如果用scanf("%s", str)读取str(我发现str是char...
  • 在c++中 ...scanf("%s", str.c_str()); printf("%d", str.length()); ``` 输出结果始终为0,这是什么原因? 应该用什么方法来得到string的长度? 哪个大佬来指点指点我这个弱鸡,感谢!
  • scanf()%d读取字符串问题cpp上p204,遇到一个问题,想不明白。求指点。谢谢。intget_int(void){intinput;charch;while(scanf("%d",&input)!=1){while((ch=getchar())!='\n')putchar(ch);//...
  • 语言技巧——scanf读入多行字符串

    千次阅读 2020-03-24 08:45:05
    #include <bits/stdc++.h> using namespace std; int main(){ char s[100004]; scanf("%[^EOF]",&s); cout<<s; } 注意这里&s和s都可
  • fgets、gets、scanf函数读入字符串比较

    千次阅读 2013-03-28 11:25:57
    //stdin表示从输入流中读入,也可以是其他文件指针。 gets(str); scanf("%s", str);其中fgets函数是安全的,gets和scanf函数都是不安全的。当输入的字符大于等于10时,会数组越界。编译不会保存,甚至运行时也不会...
  • gets读入字符串时,直到换行符结束,但换行符会被丢弃,然后在末尾自动添加‘\0’,而scanf读入字符串时,需要用%s,然后输入时如果输入了空格会认为字符串结束,如果还有输入项,空格后的字符将作为下一个输入项...
  • 当不支持gets时,getline又比较慢,可以使用scarf("%[^\n]s", str);来读入以换行表示读完的字符串,其中[^char]表示以char为结束。 转载于:https://www.cnblogs.com/AlphaWA/p/11379939.html...
  • 字符串的输入是以空格为分割的,如果遇到需要将空格也作为内容读入字符串,则需要用以下格式:scanf("%[^\n]",str);这段语句的作用是str接收输入的字符串,直到碰到回车换行符为止,也就是回车前的内容均接收为str的...
  • scanf输入字符串遇到空格?

    万次阅读 多人点赞 2019-06-02 12:34:49
    scanf输入字符串(含有空格的字符串,例如:“I love you!”)时,总是在空格处停止扫描。我们用scanf("%s",str);输入 “I love you!” 字符串后,str输出却只有 “I” ,这并不是我们想要的。这是因为scanf扫描到 ...
  • a[i][j])读入二维字符串数组时, 如果使用两个for循环, 要记得在内层循环结束后,使用getchar()读取换行符, 即: for i ~ n for j ~ n scanf("%c", &a[i][j]) end getchar() end 因为scanf...
  • scanf_s()读入字符串和数字

    千次阅读 2017-08-17 18:56:03
    scanf_s函数同时读入字符串和数字时访问冲突的问题
  • 读入字符串 scanf:不能读入空格、Tab、回车。 gets:可以读入空格、Tab、回车。但是读入回车时,字符串为空串。  所以当输入很多字符,并与换行符作为结束标志时,用gets,Code:gets(s)...
  • 给定由大写字母和空格组成的字符串,返回最后一个单词的长度。 如果输入中不存在单词,返回0. 注意: “单词”是指不包含空格符号的字符串 例如: 对于字符串"hello world"(不带引号)那么返回的结果是5 输入格式 ...
  • scanf输入字符串以及空格问题

    千次阅读 2020-02-05 18:53:09
    输入 输入字符串可选择使用数组...scanf输入字符串时,总是在字符处停止扫描,如输入‘I am a student’,输出只为‘I’ 原因 scanf输入字符串的时候不会接收Space空格,回车Enter,Tab键,则认为输入结束。scanf函...
  • 今天用scanf输入字符串的时候,输出乱码,但是我如果指定写死了字符串就没有乱码 int main() { //1.不乱码情况,但是写死了 //char str[N]="I am a good boy"; //2.乱码情况 char str[N]; printf("请输入一条...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 28,131
精华内容 11,252
关键字:

scanf读入字符串