我需要检测输入是否为新行。之后,我需要将其转换为'\0'
。这是我的代码:
void number()
{
printf(LEV3"Student No. (20XXXXXXX):\t");
int x=0, i=0;
fgets(studno[i], LEN, stdin);
if('\n'==studno[LEN-1])
{
[LEN-1]='\0';
}
x = atoi(studno[i]);
if (((x/10000000)>=21||(x/10000000)<=19))
{
printf("ERROR: Invalid Student Number. Format should be 20XXXXXXX.\n");
number();
}
i++;
}
我该怎么办?我总是在这段代码中遇到编译器错误。
答案 0 :(得分:0)
您显示的代码至少有几个语法错误。
printf(LEV3"Student No. ...
中的字符串有迷路“LEV3”。
这应该是格式字符串的一部分还是它是什么?
在检查换行符的if
中,您保留了字符串名称
尝试在字符串中设置空值时。代替
[LEN-1] = '\0';
您应该studno[LEN-1] = '\0';
。
这个函数(number
)自称...... Eek!你是说这个函数是递归的吗?目前还不清楚目的是什么。您的本地变量i
正在递增,就好像下一次调用number
会看到它一样,但它不会,因为它是一个局部变量。对于这样的事情,你只需要一个循环,而不是递归。
因此,使用@ Gangadhar的建议,您的代码最终应该看起来像这样阅读该行。我将留下其余的时间让你更新,因为我不确定你对i
等的意图是什么,而你还没有解释输入的格式是什么。我假设studno
是一个char指针数组,但你没有显示它。
void number()
{
printf("Student No. (20XXXXXXX):\t");
int x = 0, i = 0;
fgets(studno[i], LEN, stdin);
if ('\n' == studno[i][strlen(studno)-1])
{
studno[i][strlen(studno)-1] = '\0';
}
...
}
答案 1 :(得分:0)
您发布的代码存在许多问题,以及下面的代码,但我认为它可以回答您的问题。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define LEV3 "\t\t\t"
#define LEN 30
char studno[LEN+1];
void number()
{
printf(LEV3"Student No. (20XXXXXXX):\t");
fgets(studno, LEN, stdin);
int x = atoi(studno);
if (((x/10000000)>=21||(x/10000000)<=19))
{
printf("ERROR: Invalid Student Number. Format should be 20XXXXXXX.\n");
number();
}
int l = strlen(studno);
if('\n'==studno[l-1])
{
studno[l-1]='\0';
}
}
int main(int argc, char* argv[]) {
number();
printf("'%s'", studno);
return 0;
}
答案 2 :(得分:0)
使用fgets(buffer,...)
后,
1.缓冲区以第一次出现\n
然后是\0
结束
2.它只能以\0
而不是\n
结束
3.如果没有可用的输入或I / O错误,缓冲区可以保持不变。
char buffer[N];
if (fgets(buffer, sizeof(buffer), stdin) == NULL) {
; // handle no data read as file I/O error or EOF
}
else {
size_t len = strlen(buffer);
// Be sure to check for len > 0
if ((len > 0) && (buffer[len - 1] == '\n')) {
buffer[--len] = '\0';
}
// use buffer
}