【问题标题】:C - If/Else and Pointers Returning Wrong StringC - If/Else 和指针返回错误的字符串
【发布时间】:2009-10-07 02:20:19
【问题描述】:

我们有一个函数longest,它返回由字母组成的最长子串。示例:

longest("112****hel 5454lllllo454")

会返回:lllllo

但是,当我运行程序时,它似乎返回 lllllo454。这是函数:

char *longest(char *s){
    char *pMax = NULL;
    int nMax = 0;
    char *p = NULL;
    int n = 0;
    int inside = 0; //flag
    while(*s!='\0'){
        char c = *s;
        if((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')){
            if(inside == 0){
                n = 1;
                p = s;
                inside = 1;
            }
            else
                n++;
            if(inside == 1){
                if(n > nMax){
                    nMax = n;
                    pMax = p;
                    inside = 0;
                }
            }
        }//end isLetter if
        s++;
    }
    return pMax;
}

这里有一些我没有看到的东西……你们怎么看?

【问题讨论】:

    标签: c string pointers


    【解决方案1】:

    您只是返回一个指向最长子字符串中第一个字符的指针。您实际上并没有在子字符串的末尾添加字符串终止符,因此它继续到原始字符串的末尾。您可能应该将子字符串(仅序列中的那些字符)复制到新字符串并返回指向该字符串的指针。

     char* newStr = malloc(nMax+1);
     strncpy( newStr, pMax, nMax );
     *(newStr+nMax) = '\0';
     return newStr;
    

    【讨论】:

    • 否则将“int *nMax”作为输出参数。如果是这样,最好在分配给 *nMax 之前进行空检查 - 这是一个常见的“我不需要那个”约定。
    【解决方案2】:

    您正在计算nMax,但没有对这些信息做任何事情。在 C 中,char* 指向字符串的开头,该字符串以 NUL 字符终止。由于您没有修改传递给函数的缓冲区,因此返回的指针指向第一个 'l' 并继续到原始字符串的末尾。

    【讨论】:

      【解决方案3】:

      您正在返回指向最长子字符串的第一个字母的指针;你没有用它制作一个新的字符串。因此,当您将其打印出来时,它会一直打印子字符串,直到 NULL 终止符为止。

      查看strncpy函数:http://www.cplusplus.com/reference/clibrary/cstring/strncpy/

      【讨论】:

        【解决方案4】:

        这将返回以字符串开头的最大子字符串。设置inside的函数部分,如下:

        if((c &gt;= 'A' &amp;&amp; c &lt;= 'Z') || (c &gt;= 'a' &amp;&amp; c &lt;= 'z')){

        仅当c 是一个字母时才会执行。由于您想要 包含 一个字母的最大子字符串,因此您需要:

        if(c != ' '){

        然后,在那个循环中,有另一个变量,比如containsLetter,只有当你在另一个空格之前遇到一个字母时才会这样。

        【讨论】:

          猜你喜欢
          • 2015-01-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多