K& R练习3-2垃圾字符

时间:2014-06-23 17:08:24

标签: c garbage kernighan-and-ritchie

我正在研究K& R第二版,并在练习3-2中遇到了一个奇怪的问题。出于某种原因,只有\ n出现了它应该和原始字符串中的两个标签,一个显示为\而另一个完全丢失。我也在字符串中获得不同数量的垃圾,最新的输出字符串是“我是(微符号mu)。\ n”。更令人好奇的是,\ n和句点之间的空格比原始空格要多。我查找了解决方案(https://code.google.com/p/k-and-r-exercises/source/browse/3-2.c),它与我的工作非常相似。此外,我在main,'\'和't'中做了两个putchars,并且没有问题显示\ t。我对导致此错误的原因感到非常难过,并且可以真正使用您的建议。

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

void    switchFunction(char s[], char t[]);

main(){

    char    originalString[] = "I \t am \t . \n \0";
    char    copiedString[1000];
    char    a, b;

    switchFunction(originalString, copiedString);
    printf(originalString);
    printf("\n");
    printf(copiedString);
    printf("\n");

    a = '\\';
    b = 't';
    putchar(a);
    putchar(b);

}

void switchFunction(char s[], char t[]){

    int i;
    int j = 0;
    int originalStringLen;

    originalStringLen = strlen(s);
    printf("Original is %d characters.\n", originalStringLen);

    for(i = 0; i < originalStringLen; ++i){
        switch(s[i]){
            case '\n':
                t[j] = '\\';
                j++;
                t[j] = 'n';
                j++;
                break;
            case '\t':
                t[j] = '\\';
                j++;
                t[j] = 't';
                j++;
                break;
            default:
                t[i] = s[i];
                j++;
        } 
    }       
    t[j] = '\0';
}

P.S。我为函数内部的新字符串中的每个字符做了一个putchar(因为它们被分配了)并且得到了更多的垃圾字符,尽管\ t显示没有问题。

1 个答案:

答案 0 :(得分:3)

这是问题:

            t[i] = s[i];

你需要:

            t[j] = s[i];