1、使用sscanf格式化解析字符串
#include<stdio.h>
#include<string.h>
void getlongestword(char str[],char* longest)
{
char temp[20];
int l = 0;
while (sscanf(str + l, "%s", temp) != EOF)
{
if (strlen(temp) > l)
strcpy(longest, temp);
l += strlen(temp);//注意l要累加
}
}
int main()
{
char str[101] = "";
fgets(str, 101, stdin);//保证输入不会超过100
char longest[20];
getlongestword(str, longest);
puts(longest);
return 0;
}
while(sscanf(str,"%s",temp)!=EOF)中的sscanf函数返回EOF的原因有以下几种可能:
字符串str已经被完全解析,没有更多的字段可以解析。在这种情况下,sscanf函数无法提取任何内容,返回EOF。
str字符串为空或只包含空白字符(例如空格、制表符、换行符等),导致无法解析任何字段。此时,sscanf函数同样无法提取任何内容,返回EOF。
在使用%s格式进行解析时,如果遇到字符串中的空格或制表符等分隔符,sscanf函数会停止解析,并返回已解析字段的数量。如果此时没有解析到任何字段,即没有读取到有效字符,也会返回EOF。
需要注意的是,EOF是一个特殊的宏定义,表示文件结束符或输入流结束的标识符。在sscanf函数中,当无法继续解析时,它被用作返回值来指示解析的结束。
2、将10进制转换为(2-16)任意进制
#include<stdio.h>
char* baseconversion(char string[],int num,int rad,int* size)
{
char base[17] = "0123456789ABCDEF";
int flag = 0,i=0;//表示num是非负数
if (num == 0)
{
string[0] = base[num % rad];
return string;
}
if (num < 0)
{
num = 0 - num;
flag = 1;
}
while (num > 0)
{
string[i++] = base[num % rad];
num /= rad;
}
if (flag == 1)
{
string[i] = '-';
*size = i;
}
else
{
*size = i - 1;
}
return string;
}
int main()
{
int num,rad;
char string[100] = "";
printf("Please intput a num and rad:");
scanf("%d %d", &num,&rad);
int size = 0;
char* result = baseconversion(string,num,rad,&size);
for (int i = size; i >= 0; i--)
{
printf("%c", result[i]);
}
return 0;
}
这里最主要的就是要注意num小于0的情况,用flag判断一下就行。