scanf返回值什么时候会判定为-1(在输入时)
时间: 2024-04-17 18:27:44 浏览: 135
scanf 函数在输入时会返回一个整数值,表示成功读取的参数个数。当 scanf 函数无法成功读取任何参数时,它会返回 -1。这种情况通常发生在输入的格式与预期的格式不匹配时,或者输入流已经结束但仍有未读取的参数时。例如,如果你期望输入一个整数,但实际输入了一个字母,scanf 函数就无法成功读取参数,返回 -1。
相关问题
不用标准库函数strcmp,自己编写一个函数MyStrcmp 实现将两个字符串s和t进行比较, 然后将s和t中第一个不相同字符的ASCII码值之差作为函数值返回。 要求如下: (1)函数MyStrcmp函数原型为: int MyStrcmp(char s[],char t[]); (2)在主函数中 从键盘分别输入两个字符串s和t, (每个字符串的最大长度为80个字符) 然后调用MyStrcmp函数, 接下来,判定该函数的返回值: 如果大于0,输出"string s>string t.\n" 如果小于0,输出"string s<string t.\n" 如果等于0,输出"string s=string t.\n" (3)**用gets输入字符串。 **输入提示信息: 输入s之前提示:"Input s\n" 输入t之前提示:"Input t\n"
好的,我已经了解了您的问题。以下是实现您所需功能的代码:
```
#include <stdio.h>
int MyStrcmp(char s[], char t[]) {
int i = 0;
while (s[i] == t[i]) {
if (s[i] == '\0') {
return 0;
}
i++;
}
return s[i] - t[i];
}
int main() {
char s[80], t[80];
printf("Input s\n");
gets(s);
printf("Input t\n");
gets(t);
int result = MyStrcmp(s, t);
if (result > 0) {
printf("string s>string t.\n");
} else if (result < 0) {
printf("string s<string t.\n");
} else {
printf("string s=string t.\n");
}
return 0;
}
```
在这个程序中,我们定义了一个函数MyStrcmp,用于比较两个字符串s和t。这个函数的实现方式与标准库函数strcmp类似,采用了逐个比较字符的方法。
在主函数中,我们使用了gets函数来输入字符串s和t,这是因为gets可以读取一行字符串,而不是像scanf一样只能读取一个单词。注意,gets函数的使用必须非常小心,因为它可以导致缓冲区溢出。
最后,我们根据MyStrcmp函数的返回值输出相应的比较结果。
希望这个程序对您有所帮助!
在main中定义char binary[10],从屏幕上输入10位地址,调用Cache函数查找数据,将数据和Cache输出到屏幕上;定义16行的4路组相联Cache数据结构,假设与内存传输块大小为4B;编写函数char * Cache(char binary[]) 参数为10位物理地址,根据参数访问Cache,并返回读取结果。返回值为4字节的二进制数,读取Cache的替换算法为LRU算法。 Cache的算法:1.划分地址;2.根据索引查找哪一组;3.比对CacheTag;4.如果比对成功则需要判定Valid,判定成功返回CacheData,否则未查找到;6.未查找到应当从内存中读取数据到Cache中并返回数据,如果Cache已满需要根据LRU算法替换出一块,具体方法是将count最大的项替换出去,建议单独写一个函数刷新count值。
首先,我们需要定义一个Cache的数据结构,这里我们使用16行的4路组相联Cache。
```c++
typedef struct {
int valid[4]; // 4路组相联,每一路都有一个valid位
int tag[4]; // 每一路都有一个tag位
char data[4][4]; // 每一路都有4个字节的数据
int count[4]; // 用于LRU算法的计数器
} CacheLine;
CacheLine cache[16]; // 定义16行的Cache
```
接下来,我们需要实现Cache函数,根据物理地址访问Cache,并返回读取结果。这里我们使用LRU算法进行替换,使用count数组来记录每一行的访问情况。
```c++
char * Cache(char binary[]) {
// 1. 划分地址
int tag = 0;
int index = 0;
int offset = 0;
// ...
// 2. 根据索引查找哪一组
int group = index;
// 3. 比对CacheTag
int hit = -1;
for (int i = 0; i < 4; i++) {
if (cache[group].valid[i] && cache[group].tag[i] == tag) {
hit = i;
break;
}
}
// 4. 如果比对成功则需要判定Valid,判定成功返回CacheData,否则未查找到
if (hit != -1) {
// hit
// 更新count值
for (int i = 0; i < 4; i++) {
if (i != hit && cache[group].valid[i]) {
cache[group].count[i]++;
}
}
cache[group].count[hit] = 0;
return cache[group].data[hit];
} else {
// miss
// 从内存中读取数据到Cache中并返回数据
// 如果Cache已满需要根据LRU算法替换出一块
int min_count = 0x7fffffff;
int min_index = 0;
for (int i = 0; i < 4; i++) {
if (!cache[group].valid[i]) {
min_index = i;
break;
}
if (cache[group].count[i] > min_count) {
min_count = cache[group].count[i];
min_index = i;
}
}
// 替换出一块
cache[group].valid[min_index] = 1;
cache[group].tag[min_index] = tag;
// 从内存中读取数据
// ...
cache[group].count[min_index] = 0;
return cache[group].data[min_index];
}
}
```
最后,在main函数中调用Cache函数,输入10位地址,将数据和Cache输出到屏幕上。
```c++
int main() {
char binary[10];
scanf("%s", binary);
char *data = Cache(binary);
printf("Data: %s\n", data);
// 输出Cache
for (int i = 0; i < 16; i++) {
printf("Group %d: ", i);
for (int j = 0; j < 4; j++) {
if (cache[i].valid[j]) {
printf("%d:%d:%s ", cache[i].valid[j], cache[i].tag[j], cache[i].data[j]);
} else {
printf("- ");
}
}
printf("\n");
}
return 0;
}
```
阅读全文