C语言中字符串输入的处理
我正在尝试将字符串输入到固定大小的字符数组中。 我有一个问题:C语言中字符串输入的处理,c,arrays,C,Arrays,我正在尝试将字符串输入到固定大小的字符数组中。 我有一个问题: 当我输入一个比char数组大的字符串时,数组会变得更大,而不需要任何额外的声明。我想让代码只接受“等于或小于char数组”的字符串 多谢各位 代码: #包括 #包括 #包括 #包括 /***************************作用****************************/ int字符串长度(字符s[]){ int c=0; 而(s[c]!='\0') C++; 返回c; } /**************
#包括
#包括
#包括
#包括
/***************************作用****************************/
int字符串长度(字符s[]){
int c=0;
而(s[c]!='\0')
C++;
返回c;
}
/**************************************************************/
char*str;
内角大小;
void opt1()
{
printf(“输入数组大小:”);
scanf(“%d”、&arrSize);
arrSize=arrSize+1;
str=malloc(arrSize);
返回;
}
void opt2()
{
printf(“输入字符:”);
scanf(“%s”,str);
长度=字符串长度(str);
printf(“您的输入是“%s”\n”,str);
printf(“您的输入长度为“%d”\n”,长度);
返回;
}
int main()
{
int输入=0;
while(输入!=3){
printf(“\n名称\n”);
printf(“\n”);
printf(“------------------------------------------------\n”);
printf(“1)制作数组\n”);
printf(“2)检查数组\n”);
printf(“3)退出\n”);
printf(“\n输入选择:”);
scanf(“%d”,输入(&I));
如果(输入=1){
/* */
opt1();
}
else if(输入=2){
opt2();
}
}
返回1;
}
要阅读整行内容,可以使用fgets
:
char line[80];
if (fgets(line, sizeof line, stdin) != NULL) {
// use the input
}
现在,您不需要检查用户输入的字符是否超过限制,因为
fgets
将只获得前79个(-1为空终止符)字符;其余部分(如果有的话)将被忽略。要整行阅读,可以使用fgets
:
char line[80];
if (fgets(line, sizeof line, stdin) != NULL) {
// use the input
}
现在,您不需要检查用户输入的字符是否超过限制,因为
fgets
将只获得前79个(-1为空终止符)字符;其余部分(如果有的话)将被忽略。要整行阅读,可以使用fgets
:
char line[80];
if (fgets(line, sizeof line, stdin) != NULL) {
// use the input
}
现在,您不需要检查用户输入的字符是否超过限制,因为
fgets
将只获得前79个(-1为空终止符)字符;其余部分(如果有的话)将被忽略。要整行阅读,可以使用fgets
:
char line[80];
if (fgets(line, sizeof line, stdin) != NULL) {
// use the input
}
现在,您不需要检查用户输入的字符是否超过限制,因为
fgets
将只获得前79个(-1为空终止符)字符;其余部分(如果有)将被忽略。OP希望读取数据,但如果大于目标阵列,则不要更改目标阵列
// 1: success
// -1 EOF
// 0: Input too long
int read_array(char *buffer, size_t size) {
char tmp[size];
size_t i = 0;
int ch;
while ((ch = fgetc(stdin)) != EOF && ch != '\n') {
if (i < size) {
tmp[i++] = ch;
}
}
if (ch == EOF && i == 0) return EOF;
if (i >= size) return 0; // too many
memcpy(buffer, tmp, i);
buffer[i] = '\0';
return 1;
}
//1:成功
//-1 EOF
//0:输入太长
整数读取数组(字符*缓冲区,大小){
字符tmp[大小];
尺寸i=0;
int-ch;
while((ch=fgetc(stdin))!=EOF&&ch!='\n'){
如果(i=size)返回0;//太多
memcpy(缓冲区、tmp、i);
缓冲区[i]='\0';
返回1;
}
通常情况下,代码可以使用
fgets()
,但也存在无法达到OP目标的极端情况。OP希望读取数据,但如果大于目标数组,则不要更改目标数组
// 1: success
// -1 EOF
// 0: Input too long
int read_array(char *buffer, size_t size) {
char tmp[size];
size_t i = 0;
int ch;
while ((ch = fgetc(stdin)) != EOF && ch != '\n') {
if (i < size) {
tmp[i++] = ch;
}
}
if (ch == EOF && i == 0) return EOF;
if (i >= size) return 0; // too many
memcpy(buffer, tmp, i);
buffer[i] = '\0';
return 1;
}
//1:成功
//-1 EOF
//0:输入太长
整数读取数组(字符*缓冲区,大小){
字符tmp[大小];
尺寸i=0;
int-ch;
while((ch=fgetc(stdin))!=EOF&&ch!='\n'){
如果(i=size)返回0;//太多
memcpy(缓冲区、tmp、i);
缓冲区[i]='\0';
返回1;
}
通常情况下,代码可以使用
fgets()
,但也存在无法达到OP目标的极端情况。OP希望读取数据,但如果大于目标数组,则不要更改目标数组
// 1: success
// -1 EOF
// 0: Input too long
int read_array(char *buffer, size_t size) {
char tmp[size];
size_t i = 0;
int ch;
while ((ch = fgetc(stdin)) != EOF && ch != '\n') {
if (i < size) {
tmp[i++] = ch;
}
}
if (ch == EOF && i == 0) return EOF;
if (i >= size) return 0; // too many
memcpy(buffer, tmp, i);
buffer[i] = '\0';
return 1;
}
//1:成功
//-1 EOF
//0:输入太长
整数读取数组(字符*缓冲区,大小){
字符tmp[大小];
尺寸i=0;
int-ch;
while((ch=fgetc(stdin))!=EOF&&ch!='\n'){
如果(i=size)返回0;//太多
memcpy(缓冲区、tmp、i);
缓冲区[i]='\0';
返回1;
}
通常情况下,代码可以使用
fgets()
,但也存在无法达到OP目标的极端情况。OP希望读取数据,但如果大于目标数组,则不要更改目标数组
// 1: success
// -1 EOF
// 0: Input too long
int read_array(char *buffer, size_t size) {
char tmp[size];
size_t i = 0;
int ch;
while ((ch = fgetc(stdin)) != EOF && ch != '\n') {
if (i < size) {
tmp[i++] = ch;
}
}
if (ch == EOF && i == 0) return EOF;
if (i >= size) return 0; // too many
memcpy(buffer, tmp, i);
buffer[i] = '\0';
return 1;
}
//1:成功
//-1 EOF
//0:输入太长
整数读取数组(字符*缓冲区,大小){
字符tmp[大小];
尺寸i=0;
int-ch;
while((ch=fgetc(stdin))!=EOF&&ch!='\n'){
如果(i=size)返回0;//太多
memcpy(缓冲区、tmp、i);
缓冲区[i]='\0';
返回1;
}
通常情况下,代码可以使用
fgets()
,但也存在无法达到OP目标的极端情况。1)scanf(“%s\n”,&str)代码>-->scanf(“%s”,str)代码>str的类型是char*
。(请参见char*str;
)。您的实际代码charstr代码>,而不是char*str代码>。请看,我放置的字符数比数组大小还多,这也需要它。这是未定义的行为。可能会发生意外的内存破坏。如果出现故障,则可能不会立即发现,即使已立即发现故障原因。请使用realloc
。通过malloc
保护的内存块可以通过realloc
.1)scanf(“%s\n”和&str)扩展代码>-->scanf(“%s”,str)代码>str的类型是char*
。(请参见char*str;
)。您的实际代码charstr代码>,而不是char*str代码>。请看,我放置的字符数比数组大小还多,这也需要它。这是未定义的行为。可能会发生意外的内存破坏。它可能不会被发现