编辑:当传递给 char *str 时,fgets 会考虑 *stream 中的多少个 char? [已关闭]

问题描述 投票:0回答:2

这个简单的根本性错误我已经坐了一段时间了。 我们如何避免标准输入中的字符串大于定义的 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

c fgets feof ferror
2个回答
1
投票

您无法避免错误的输入。您的程序可以“检测”它并做出响应。通常最正确的响应是... 终止(带有错误消息)! 获取用户输入字符串通常应如下所示:

// 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();

换句话说,让你的程序要求输入有效才能成功。


0
投票

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

如果你不明白某些东西,我强烈建议你在你的阶段编写类似的小程序。

© www.soinside.com 2019 - 2024. All rights reserved.