我的函数遍历字符串的长度

时间:2015-03-27 18:17:47

标签: c string function overflow

我正在尝试制作比较字母到字符串我插入的所有字母的函数,并打印我没有使用的字母。但是当我打印这些字母时,它会翻过来并在结尾处给我随机符号。这是函数的链接,我如何调用函数和结果:http://imgur.com/WJRZvqD,U6Z861j,PXCQa4V#0

以下是代码:(http://pastebin.com/fCyzFVAF

void getAvailableLetters(char lettersGuessed[], char availableLetters[])
{
        char alphabet[]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
        int LG,LG2,LA=0;
        for (LG=0;LG<=strlen(alphabet)-1;LG++)
        {
                for(LG2=0;LG2<=strlen(lettersGuessed)-1;LG2++)
                {
                        if (alphabet[LG]==lettersGuessed[LG2])
                        {
                                break;
                        }
                        else if(alphabet[LG]!=lettersGuessed[LG2] &&LG2==strlen(lettersGuessed)-1)
                        {
                                availableLetters[LA]=alphabet[LG];
                                LA++;
                        }
                }
        }
}

这是调用函数的程序:

#include <stdio.h>
#include <string.h>
#include "hangman.c"

int main() 
{
    int i = 0;
    char result[30];
    char text[30];
    scanf("%s", text);

    while(i != strlen(text))
    {
        i++;
    }

    getAvailableLetters(text, result);
    printf("%s\n", result);
    printf ("%d", i);
    printf ("\n");
}

这是我输入abcd的结果:efghijklmnopqrstuvwxyzUw▒ˉ

4 个答案:

答案 0 :(得分:2)

如果要将result打印为字符串,则需要在其末尾包含终止空值(这就是printf知道何时停止的方式)。

答案 1 :(得分:2)

for %s printf在到达空字符'\0'时停止打印,因为%s期望字符串为空终止,但result未终止并且&# 39;为什么你最后得到随机符号

只需在函数availableLetters[LA] = '\0'

的最后一行添加getAvailableLetters即可

http://pastebin.com/fCyzFVAF

答案 2 :(得分:1)

确保您的字符串以NULL结尾(例如,在结尾处有一个&#39; \ 0&#39;字符)。这也意味着确保保存字符串的缓冲区足够大以包含空终止符。

有时候人们认为他们有一个空终止的字符串,但字符串溢出了内存中的边界并截断了空终止符。这就是你总是想要使用读取数据的函数形式(在这种情况下不适用)的原因,例如sprintf()应该调用snprintf(),以及任何其他可以编写的函数进入一个缓冲区,以便让你明确限制长度,这样你就不会被病毒或漏洞利用严重攻击。

答案 3 :(得分:0)

char alphabet[]={'a','b','c', ... ,'x','y','z'};不是字符串。它只是一个“char的数组26”。

  

在C中,“A string 是一个连续的字符序列,由第一个空字符终止并包括......”。 C11§7.1.11

strlen(alphabet)需要字符串。由于代码未提供字符串,因此结果未定义。

要修复,请确保alphabet字符串

char alphabet[]={'a','b','c', ... ,'x','y','z', 0};
// or
char alphabet[]={"abc...xyz"};  // compiler appends a \0

现在alphabet是“char的数组27”,还有字符串


第2期:for(LG2=0;LG2<=strlen(lettersGuessed)-1;LG2++)有2个问题。

1)每次循环时,代码都会重新计算字符串的长度。最好计算一次字符串长度,因为字符串长度在循环内不会改变。

    size_t len = strlen(lettersGuessed);
    for (LG2 = 0; LG2 <= len - 1; LG2++)

2)strlen()返回类型size_t。这是一些无符号整数类型。如果lettersGuessed的长度为0(可能是""),则字符串长度 - 1不是-1,而是一些非常大的数字,因为无符号算术“包裹”并且循环可能永远不会停止接下来是一个简单的解这个解决方案只会失败,因为字符串的长度超过了INT_MAX

    int len = (int) strlen(lettersGuessed);
    for (LG2 = 0; LG2 <= len - 1; LG2++)

没有此限制的解决方案将始终使用size_t

    size_t LG2;
    size_t len = strlen(lettersGuessed);
    for (LG2 = 0; LG2 < len; LG2++)