这个简单的根本性错误我已经坐了一段时间了。 我们如何避免标准输入中的字符串大于定义的 sizeof(sring)。这里 sizeof(stdin_passed) > sizeof(word_new)。此外,我们仅限于使用、ferr 和/或 feof。
提前致谢
编辑: 提示是,没有 角色,我会尝试与它合作
编辑2: 由于一段代码未显示,因此发生了分段错误。我的错。
编辑 3:它考虑 *stream 中的所有字符,直到满为止。 char *str 可以以 ' 结尾 ' 或任何字符。
int main() {
char word_new[42];
while(1) {
/*help needed here: ouput is Segmentation Error*/
if (fgets(word_new, sizeof(word_new), stdin) == NULL){
// error occurs, thus use perror
if(ferror(stdin)){
perror("error occured in stdin");
exit(1);
}
// no error and only EOF reached
break;
}
//not previously provided snippet:
char *wordpt = strchr(word_new, '\n');
*wordpt = '\0';
//no '\n' character => error
您无法避免错误的输入。您的程序可以“检测”它并做出响应。通常最正确的响应是... 终止(带有错误消息)! 获取用户输入字符串通常应如下所示:
// String space for input is reasonable, but not unlimited:
char s[100];
// Attempt to get input -- fail if not obtained
if (!fgets( s, sizeof(s), stdin )) complain_and_quit();
// Verify you got an entire line of input -- fail if not obtained
char * p = strpbrk( s, "\n\r" );
if (!p && !feof(stdin)) complain_and_quit();
if (p) *p = '\0';
// Now that I have a verified full line of input from the user,
// I can do stuff with it, such as try to convert it to an integer, etc.
int value;
if (!convert_to_integer( s, &value )) complain_and_quit();
换句话说,让你的程序要求输入有效才能成功。
int main(void)
{
char word_new[5];
int loopno = 0;
char *result = word_new;
while(result)
{
/*help needed here: ouput is Segmentation Error*/
if ((result = fgets(word_new, sizeof(word_new), stdin)))
{
// error occurs, thus use perror
if(ferror(stdin)){
perror("error occured in stdin");
exit(1);
}
printf("Loop no: %d\n", ++loopno);
for(size_t index = 0; index < sizeof(word_new) && word_new[index]; index++)
{
printf("word_new[%zu] - '%s' Code: % 3hhd (0x%02hhx)\n", index, isprint(word_new[index]) ? (char [2]){word_new[index], 0} : "NP", word_new[index], word_new[index]);
}
}
}
}
1234567890
的结果是不言自明的
Loop no: 1
word_new[0] - '1' Code: 49 (0x31)
word_new[1] - '2' Code: 50 (0x32)
word_new[2] - '3' Code: 51 (0x33)
word_new[3] - '4' Code: 52 (0x34)
Loop no: 2
word_new[0] - '5' Code: 53 (0x35)
word_new[1] - '6' Code: 54 (0x36)
word_new[2] - '7' Code: 55 (0x37)
word_new[3] - '8' Code: 56 (0x38)
Loop no: 3
word_new[0] - '9' Code: 57 (0x39)
word_new[1] - '0' Code: 48 (0x30)
word_new[2] - 'NP' Code: 10 (0x0a)
https://godbolt.org/z/9MYerPf67如果你不明白某些东西,我强烈建议你在你的阶段编写类似的小程序。