2013-02-25 61 views
1

我想创建一个能够在k点旋转的程序,定义为“请求的旋转”。使用strcat的C程序在运行时不断给出意外输出

实施例:旋转( “DERP”,3)=> PDER

我给该功能代码被称为旋转,如下面列出。它包含一个char指针数组,startString(在我的main中定义)和旋转数(一个long int,因为我使用atol从命令行获取整数)。

int rotate(char *startString, long int rotations) { 
    char *doubleString = malloc((sizeof startString * 2) + sizeof(char)); 
    strcat(doubleString, startString); 
    strcat(doubleString, startString); 
    long int stringSize = (sizeof startString - 1); 
    long int breakIndex = (rotations % stringSize); 
    char* rotatedString = malloc((sizeof startString + sizeof(char))); 

    int i; 

    for (i = 0; i < stringSize + 1; i++) { 
     char pushedCharacter = doubleString[(int)breakIndex + i]; 
     strcat(rotatedString, &pushedCharacter); 
    } 

    printf("%s\n", rotatedString); 
    printf("%s\n", doubleString); 
    return 0; 

} 

但是,当我输出时,如果我使用类似doghouse的东西,我会变得很奇怪吗?在rotateString的输出前面。它也完全不能用于derp,而是用相同的打印出pderp?4前面。此运行时错误是由什么引起的?

编辑

给出的答案是正确的,但我们的目标是能够接受的旋转比定字符串的长度。这代码如下:

void rotate(char * startString, long int rotations) { 
    long int stringSize = strlen(startString); 

    long int breakIndex = (rotations % stringSize); 
    char *rotatedString = malloc(stringSize + 1); //counting extra char for null terminator 
    strncpy(rotatedString, startString + breakIndex, stringSize - breakIndex); 
    strncpy(rotatedString + stringSize - breakIndex, startString, breakIndex); 
    rotatedString[stringSize] = '\0'; // for the ending null character of the char array 

    printf("Result: %s\n", rotatedString); 
    free(rotatedString); 

}

+1

1)'字符* doubleString = malloc的((的sizeof startString * 2)+的sizeof(char)的);'的malloc()不初始化存储器。 2)根据定义,sizeof startstring产生'sizeof(char *)'3)'sizeof(char)'为1。 – wildplasser 2013-02-25 23:35:55

回答

2

你doublestring初始化,因为你使用的sizeof(startstring),这是一个指针的大小分配内存太少,不是strlen的(startstring)+ 1是包含终止NUL字符的字符串的长度。这意味着你的代码覆盖了缓冲区的末尾,并产生了很多结果。尝试以下方法:

void rotate(char * startString, int rotation) { 
    int len = strlen(startString); 
    if (len == 0 || len <= rotation) 
     return; 

    char *rotatedString = malloc(len + 1); /* One extra char for the terminating NUL */ 
    strncpy(rotatedString, startString + rotation, len - rotation); 
    strncpy(rotatedString + len - rotation, startString, rotation); 
    rotatedString[len] = '\0'; 

    printf("%s\n", rotatedString); 
    free(rotatedString);  /* don't leak memory! */ 
} 
+0

此代码工作正常,但我们无法限制旋转。我会为任何认为有趣的人做一个快速编辑。 – jadengore 2013-02-26 02:18:44