Skip to content

C语言学习笔记(二)

Posted in 每刻,知识分享

用CLION时出现的问题

似乎是CMakeList.txt里的语言选错了,把cpp改成c99就好了。
cmake_minimum_required(VERSION 3.3)
project(clearn)

set字符串和格式化输入输出(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c99")

set(SOURCE_FILES float_calculate.c)
add_executable(clearn ${SOURCE_FILES})

一开始${CMAKE_CXX_FLAGS} -std=c99的值是c++11。。结果半天编译不出来orz

字符串和格式化输入输出

1.scanf是以空格为单位划分变量的,所以如果输入中存在空格,空格后的内容将被赋给下一个变量。

所以今天做strlen的实验会发生神奇的现象。

#include <stdio.h>

#include <string.h>

int main(){

char name[40];

printf(“What’s your name?\n”);

printf(“Input:_________\b\b\b\b\b\b\b\b\b”);

scanf(“%s”,name);

printf(“Oh,%s,what a fucking name!\n”,name);

printf(“sizeof:%d;strlen:%d\n”,sizeof(name),strlen(name));

return 0;

}
如果输入的是Melody,那么sizeof返回40,strlen返回6,正常。

可是如果输入的是Melody Chan,那么sizeof返回40,strlen还是返回6,这就可以解释了,所以要处理这样的字符串,必须要想办法处理空格,或者不处理空格,直接按位读取做循环。

这里留着代码备用

#include <stdio.h>
#define MAXLEN 10  // 能够统计的字符串的最大长度

int getStr(char line[], int nmax);

int main(void){
int strLen;
char buffer[MAXLEN+1];

while(1){
printf(“Input your string: “);
strLen = getStr(buffer, MAXLEN);
if (strLen==0)  // 输入空行,结束程序
break;
printf(“string = %s\nlength = %d\n\n”, buffer, strLen);
};
}

int getStr(char *buffer, int maxLen){
char c;  // 读取到的一个字符
int len = 0;  // 当前输入的字符串的长度

// 一次读取一个字符,保存到buffer
// 直到遇到换行符(\n),或者长度超过maxLen时,停止读取
while( (c=getchar()) != ‘\n’ ){
buffer[len++]=c;  // 将读取到的字符保存到buffer
if(len>=maxLen){
break;
}
}
buffer[len]=’\0′;  // 读取结束,在末尾手动添加字符串结束标志
fflush(stdin);  // 刷新输入缓冲区

return len;
}

来自 <http://c.biancheng.net/cpp/html/2821.html>而用来处理更一般的字符串,使用gets()函数等方法。

2.有关字符串和字符的区别,可以说字符‘x’是基本类型。

而字符串“x”是派生类型,实际上是‘x’和空字符‘\0’组成的。从左侧的代码也可以看出,字符串实际上是一个数组,或者说一个序列,连续的字符序列。

3.计算常量的时候strlen能够给出准确的数目而不是计算到空格就停止,而计算常量的时候sizeof会比strlen1,是因为sizeof还会计算看不见的空字符。

sizeof还有两种使用形式,一种是使用圆括号,一种是不使用圆括号。是否使用圆括号取决于是获取类型大小还是获取某个具体量(常量)的大小。圆括号对于类型是必须的,对于具体量却是可选的,综上所述,全都用圆括号比较好。至于为什么对于具体的量不需要括号,我认为可能是常量经过了预处理器处理,所以处理的方式有所不同。

4.getchar,putchar,专门用于处理字符的函数。如果输入了字符串就会读取一个字符,剩下的字符留到下一次读取。

5.ctype.h系列字符函数,用于判断字符类型,这些函数接受一个字符作为参数,如果该字符属于某特定的种类则返回非零值,否则返回零

Isalpha()判断是否是字母。

映射函数不改变原参数的值,只返回改变后的值。如

Tolower()返回小写后的值,不改变原参数的值。

 

ctype.h的字符判断函数:

Isalnum 字母数字

Isalpha 字母

Isblank 一个标准的空白字符(空格、水平制表符、换行),及其他本地化空白字符

Iscntrl 控制符  ctrl+B这种

Isdigit 阿拉伯数字

Isghaph 除了空格符之外所有可打印字符

Islower 小写字母

Isprint  可打印字符

Ispunct 标点符号

Isspace 空白 空格换行走纸回车垂直制表符水平制表符

Isupper 大写字母

Isxdigit 十六进制数字字符

 

ctype.h的字符映射函数

Tolower 返回小写

Toupper 返回大写

Be First to Comment

Leave a Reply

Your email address will not be published. Required fields are marked *