我应该编写一个程序来提取从www.开始到.edu结束的网址程序显示用户输入的内容中包含的网址如果输入不包含以www.开头、以.edu结尾的网址,则程序应显示一条消息,指示找不到这样的网址。

Input: http://www.usf.edu/admission
Output: www.usf.edu
Input: https://www.facebook.com/
Output: Web address starting with www. and ending with .edu not found

但是,当我的程序运行时,它没有显示正确的输出我没有任何编译器错误或警告,所以我不确定问题可能在哪里。
// This program extracts the text from the website URL
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define STR_LEN 1000

void read_line(char *str, int n);
void pass_check(char *str);
void extract(char *s1, char *s2);

int main(void)
{
    char instr[STR_LEN + 1];
    char outstr[STR_LEN + 1];

    printf("Please enter a URL: ");
    read_line(instr, STR_LEN);
    extract(instr, outstr);

    puts(outstr);
    pass_check(outstr);

    return 0;
}

void extract(char *s1, char *s2) {
    char *p, *q;
    q = s2;
    for (p = s1 + 7; *p != 0; p++) {
        if (*p == '/')
            break;
        else {
            *q = *p;
            q++;
        }
    }
    *q = '\0';
    *p = '\0';
}

void read_line(char *str, int n) {
    int ch;
    int i = 0;
    while ((ch = getchar()) != '\n') {
        if (i < n) {
            *str++ = ch;
            i++;
        }
    }
    *str = '\0';
}

void pass_check(char *str) {
    const char *fref = "www";
    const char *lref = "edu";

    int len = strlen(str);
    printf("%d", len);

    char *l = &str[len - 3];
    char f[STR_LEN + 1];

    strncpy(f, str, 3);

    if ((strcmp(f, fref) == 0) && strcmp(l, lref) == 0) {
        printf("Output: ");
        puts(str);
        printf("\n");
    } else
        printf("Please only insert a .edu URL.");
}

最佳答案

函数strncpy()不会执行您认为它会执行的操作:strncpy(f, str, 3);不会向f追加空字节,因此strcmp(f, fref);实际上具有未定义的行为,因为f在前3个字节之后未初始化。
不要使用此功能,请从以下博客了解原因:
https://randomascii.wordpress.com/2013/04/03/stop-using-strncpy-already/
https://blog.liw.fi/posts/strncpy/
还要注意,如果文件为空或没有以换行符结尾,则readline()函数将运行无限循环。
以下是更正版本:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define STR_LEN 1000

void read_line(char *str, size_t n);
int extract(const char *str, char *dest);

int main(void) {
    char instr[STR_LEN + 1];
    char outstr[STR_LEN + 1];

    printf("Please enter a URL: ");
    read_line(instr, sizeof(instr));
    if (extract(instr, outstr)) {
        puts(outstr);
    } else {
        printf("Web address starting with www. and ending with .edu not found\n");
    }
    return 0;
}

int read_line(char *str, size size) {
    int ch;
    size_t i = 0;
    while ((ch = getchar()) != EOF && c != '\n') {
        if (i + 1 < size) {
            str[i++] = ch;
        }
    }
    str[i] = '\0';
    return (ch == EOF && i == 0) ? EOF : i;
}

int extact(const char *str, char *dest) {
    const char *p;

    *dest = '\0';

    for (;;) {
        if ((p = strstr(str, "https://www.")) != NULL) {
            p += 8;  // skip the https:// prefix
        } else
        if ((p = strstr(str, "http://www.")) != NULL) {
            p += 7;  // skip the http:// prefix
        } else {
            break;
        }
        // URL starts with www.
        size_t len = strcspn(p, "/ \n");  // compute length of website name
        if (len > 8 && !memcmp(p + len - 4, ".edu", 4)) {
            // copy website name, assuming dest is at least as large as str
            strncat(dest, p, len);
            return 1;
        }
        str = p + len;
    }
    return 0;
}

关于c - 输出不符合预期,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42428541/

10-11 20:55