为什么退出 do-while 循环后程序会崩溃,要求在 C 中输入?
Why does program crash after exiting do-while loop asking for input in C?
我在正确使用 do-while 循环以在一个输入比您想要的长时继续请求另一个字符串时遇到问题。输入一个太大的字符串后,程序需要另一个字符串,但在我输入可接受的字符串后,程序崩溃而不是正常退出,这是为什么?这只是一个更大程序的代码的一部分。另外,我对C比较陌生。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define STRING_MAX 100
int main()
{
//Declaration of variables
char temp_input[STRING_MAX];
//Read input
do
{
scanf("%s", temp_input);
}while(strlen(temp_input)>STRING_MAX);
return 0;
}
感谢大家的帮助!!
您正在导致 缓冲区溢出,请勿将 scanf
用于此目的。
使用getchar()
从标准输入读取。它一次获取一个字符,因此如果字符串太长,您可以中断。也许你想要像
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define STRING_MAX 100
int main()
{
//Declaration of variables
char temp_input[STRING_MAX];
int ch; // char just read
int ins; // insert point
//Read input
ins = 0; // start at begining
for(;;)
{
ch = getchar();
if( ch == 13 ) // return char
{
temp_input[ins] = 0; // null terminate string
break;
}
temp_input[ins] = ch;
ins++; // move up next insert point
if( ins == STRING_MAX )
{
temp_input[STRING_MAX-1] = 0; // null terminate;
break; // at end of string
}
}
return 0;
}
代码失败,因为 scanf("%s", temp_input);
无法防止过长的输入溢出 temp_input
导致未定义的行为 (UB)
fgets()
备选方案:
char buf[STRING_MAX];
while (fgets(buf, sizeof buf, stdin) != NULL) {
// if input does not end with \n, assume additional char for this line.
if (strchr(buf, '\n') == NULL) {
int ch;
// Get extra char and throw away.
while ((ch = fgetc(stdin)) != '\n' && ch != EOF)
;
}
// do something with buf - get rid of potential trailing \n, then print
buf[strcspn(buf, "\n")] = 0;
puts(buf); // this also prints a \n
// now get next line
}
根据评论,我认为这就是您真正想要的
#include <stdio.h>
#define STRING_MAX 10
int main (void)
{
char string[STRING_MAX];
unsigned int count;
unsigned int total;
int chr;
do {
count = 0;
total = 0;
while (((chr = getchar()) != EOF) && (chr != '\n'))
{
if (count < STRING_MAX - 1)
string[count++] = chr;
total += 1;
}
string[count] = '[=10=]';
} while (total > STRING_MAX - 1);
printf("The input string was:\n\t%s\n", string);
return 0;
}
我在正确使用 do-while 循环以在一个输入比您想要的长时继续请求另一个字符串时遇到问题。输入一个太大的字符串后,程序需要另一个字符串,但在我输入可接受的字符串后,程序崩溃而不是正常退出,这是为什么?这只是一个更大程序的代码的一部分。另外,我对C比较陌生。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define STRING_MAX 100
int main()
{
//Declaration of variables
char temp_input[STRING_MAX];
//Read input
do
{
scanf("%s", temp_input);
}while(strlen(temp_input)>STRING_MAX);
return 0;
}
感谢大家的帮助!!
您正在导致 缓冲区溢出,请勿将 scanf
用于此目的。
使用getchar()
从标准输入读取。它一次获取一个字符,因此如果字符串太长,您可以中断。也许你想要像
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define STRING_MAX 100
int main()
{
//Declaration of variables
char temp_input[STRING_MAX];
int ch; // char just read
int ins; // insert point
//Read input
ins = 0; // start at begining
for(;;)
{
ch = getchar();
if( ch == 13 ) // return char
{
temp_input[ins] = 0; // null terminate string
break;
}
temp_input[ins] = ch;
ins++; // move up next insert point
if( ins == STRING_MAX )
{
temp_input[STRING_MAX-1] = 0; // null terminate;
break; // at end of string
}
}
return 0;
}
代码失败,因为 scanf("%s", temp_input);
无法防止过长的输入溢出 temp_input
导致未定义的行为 (UB)
fgets()
备选方案:
char buf[STRING_MAX];
while (fgets(buf, sizeof buf, stdin) != NULL) {
// if input does not end with \n, assume additional char for this line.
if (strchr(buf, '\n') == NULL) {
int ch;
// Get extra char and throw away.
while ((ch = fgetc(stdin)) != '\n' && ch != EOF)
;
}
// do something with buf - get rid of potential trailing \n, then print
buf[strcspn(buf, "\n")] = 0;
puts(buf); // this also prints a \n
// now get next line
}
根据评论,我认为这就是您真正想要的
#include <stdio.h>
#define STRING_MAX 10
int main (void)
{
char string[STRING_MAX];
unsigned int count;
unsigned int total;
int chr;
do {
count = 0;
total = 0;
while (((chr = getchar()) != EOF) && (chr != '\n'))
{
if (count < STRING_MAX - 1)
string[count++] = chr;
total += 1;
}
string[count] = '[=10=]';
} while (total > STRING_MAX - 1);
printf("The input string was:\n\t%s\n", string);
return 0;
}