C语言如何判断输入一段字符串
C语言判断输入字符串的方法有很多,例如,使用scanf
函数、gets
函数、fgets
函数、字符串函数库等。 在这些方法中,fgets
函数非常适合处理输入字符串,因为它可以防止缓冲区溢出并且能够读取包含空格的字符串。
fgets
函数的使用:
fgets
函数的原型是char *fgets(char *str, int n, FILE *stream);
。它从指定的输入流中读取最多n-1
个字符,并将它们存储在str
中,最后在str
的末尾添加一个空字符。这样可以确保字符串不会越界。
#include <stdio.h>
int main() {
char str[100];
printf("请输入一段字符串:");
if (fgets(str, sizeof(str), stdin) != NULL) {
printf("你输入的字符串是:%sn", str);
} else {
printf("输入错误。n");
}
return 0;
}
在这段代码中,fgets
函数从标准输入stdin
读取最多99
个字符,并将其存储在str
中。如果读取成功,则输出该字符串,否则输出错误信息。
一、使用scanf
函数读取字符串
scanf
函数是C语言中最常用的输入函数之一。然而,scanf
在读取字符串时有一些局限性,如它不能读取包含空格的字符串,并且可能导致缓冲区溢出。
#include <stdio.h>
int main() {
char str[100];
printf("请输入一段字符串:");
scanf("%s", str);
printf("你输入的字符串是:%sn", str);
return 0;
}
在这段代码中,scanf
函数只能读取第一个空格之前的字符。如果输入字符串中包含空格,那么它只会读取第一个单词。
二、使用gets
函数读取字符串
gets
函数可以读取包含空格的字符串,但它存在严重的安全漏洞:如果输入的字符串长度超过缓冲区大小,会导致缓冲区溢出。因此,gets
函数在现代C标准(C11)中已被弃用。
#include <stdio.h>
int main() {
char str[100];
printf("请输入一段字符串:");
gets(str);
printf("你输入的字符串是:%sn", str);
return 0;
}
尽管gets
函数可以读取包含空格的字符串,但由于其不安全性,不推荐使用。
三、使用fgets
函数读取字符串
fgets
函数是更安全的选择,它可以防止缓冲区溢出,并且能够读取包含空格的字符串。
#include <stdio.h>
int main() {
char str[100];
printf("请输入一段字符串:");
if (fgets(str, sizeof(str), stdin) != NULL) {
printf("你输入的字符串是:%sn", str);
} else {
printf("输入错误。n");
}
return 0;
}
fgets
函数从标准输入读取最多sizeof(str) - 1
个字符,并将其存储在str
中。如果读取成功,则输出该字符串,否则输出错误信息。
四、字符串函数库的使用
C标准库提供了许多字符串处理函数,如strlen
、strcpy
、strcmp
等,这些函数可以帮助我们更方便地操作字符串。
1、计算字符串长度
strlen
函数用于计算字符串的长度,不包括末尾的空字符。
#include <stdio.h>
#include <string.h>
int main() {
char str[100];
printf("请输入一段字符串:");
if (fgets(str, sizeof(str), stdin) != NULL) {
size_t length = strlen(str);
printf("字符串的长度是:%zun", length);
} else {
printf("输入错误。n");
}
return 0;
}
2、复制字符串
strcpy
函数用于将源字符串复制到目标字符串中。
#include <stdio.h>
#include <string.h>
int main() {
char src[100], dest[100];
printf("请输入源字符串:");
if (fgets(src, sizeof(src), stdin) != NULL) {
strcpy(dest, src);
printf("复制后的字符串是:%sn", dest);
} else {
printf("输入错误。n");
}
return 0;
}
3、比较字符串
strcmp
函数用于比较两个字符串。它返回一个整数,根据比较结果可能为负、零或正。
#include <stdio.h>
#include <string.h>
int main() {
char str1[100], str2[100];
printf("请输入第一个字符串:");
if (fgets(str1, sizeof(str1), stdin) != NULL) {
printf("请输入第二个字符串:");
if (fgets(str2, sizeof(str2), stdin) != NULL) {
int result = strcmp(str1, str2);
if (result == 0) {
printf("两个字符串相等。n");
} else {
printf("两个字符串不相等。n");
}
} else {
printf("输入错误。n");
}
} else {
printf("输入错误。n");
}
return 0;
}
五、字符串的其他操作
除了以上提到的基本操作,C语言中的字符串处理还包括字符串拼接、查找子串、替换子串等。
1、字符串拼接
strcat
函数用于将源字符串拼接到目标字符串的末尾。
#include <stdio.h>
#include <string.h>
int main() {
char str1[100], str2[50];
printf("请输入第一个字符串:");
if (fgets(str1, sizeof(str1), stdin) != NULL) {
printf("请输入第二个字符串:");
if (fgets(str2, sizeof(str2), stdin) != NULL) {
strcat(str1, str2);
printf("拼接后的字符串是:%sn", str1);
} else {
printf("输入错误。n");
}
} else {
printf("输入错误。n");
}
return 0;
}
2、查找子串
strstr
函数用于在一个字符串中查找另一个字符串的首次出现。
#include <stdio.h>
#include <string.h>
int main() {
char str[100], substr[50];
printf("请输入主字符串:");
if (fgets(str, sizeof(str), stdin) != NULL) {
printf("请输入子字符串:");
if (fgets(substr, sizeof(substr), stdin) != NULL) {
char *pos = strstr(str, substr);
if (pos != NULL) {
printf("子字符串首次出现的位置是:%ldn", pos - str);
} else {
printf("未找到子字符串。n");
}
} else {
printf("输入错误。n");
}
} else {
printf("输入错误。n");
}
return 0;
}
3、替换子串
在C语言中,替换子串没有直接的标准库函数,但可以通过自定义函数实现。
#include <stdio.h>
#include <string.h>
void replaceSubstring(char *str, const char *oldSubstr, const char *newSubstr) {
char buffer[1000];
char *pos;
int oldLen = strlen(oldSubstr);
int newLen = strlen(newSubstr);
buffer[0] = '