这个简单的C代码发生了什么?

时间:2015-02-27 22:55:27

标签: c string

我正在自学C。我有以下代码,通过char前后打印字符串char:

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

main(){
    char *str; 
    fgets(str, 100, stdin);
    //printf("%i", strlen(str));
    int i;

    for(i = 0; i < strlen(str) - 1; i++){
        printf("%c", str[i]);
    }
    for(i = strlen(str); i > -1; i--){
        printf("%c", str[i]);
    }
}

运行时,它给出了以下输出(假设我键入了“hello”):

cello
ollec

另外,如果我取消注释第7行代码,我得到以下输出(假设我输入“hello”):

6 ♠

对于我的生活,我无法弄清楚我正在做什么导致输出中的第一个字符发生变化。在第二个例子中,我知道字符串长度为6,因为'h'+'e'+'l'+'l'+'o'+'\ 0'= 6.这很好,但是在哪里锹符号来自?为什么只打印其中一个?

对我来说很明显,我对这里发生的事情有一些根本的误解,我无法在其他地方找到任何这方面的例子。任何人都可以解释这里出了什么问题吗?

5 个答案:

答案 0 :(得分:5)

您永远不会为字符串分配内存。而不是

char *str;

使用

char str[100];

这样,您就可以通过fgets调用在那里阅读最多100个字符。

答案 1 :(得分:3)

在此代码中:

char *str; 
fgets(str, 100, stdin);

str指向有效随机位置。然后你告诉fgets读取字符并将它们放在str指向的位置。这会导致未定义的行为;您看到的症状可能会发生,因为str碰巧指向某个内存,其中该内存的第一个字符用于其他目的,但其他字符未被使用。

相反,你需要分配内存:

char str[100];    // allocate 100 bytes
fgets(str, 100, stdin);

指针只指向已在某处分配的内存;他们没有“拥有”或“包含”任何记忆。

答案 2 :(得分:2)

你应该为你的字符串预先分配空间,否则你写的是谁知道哪里,哪个是坏的。

char str[100]; //I must be big enough to hold anything fgets might pass me

您还应该确保只访问包含字符的字符串部分:

for(i = strlen(str)-1; i > -1; i--){
    printf("%c", str[i]);
}

请注意strlen(str)处的字符是\0,字符串终止的空字符。因此,您可以访问此空间,但尝试打印或以其他方式将其视为标准字母,这将导致某些问题。

答案 3 :(得分:1)

您的str是指向char的指针,但您没有任何实际的字符缓冲区可供指向。你需要一个字符数组:

char str[100];

只有这样fgets才能存储它所读取的数据。

然后在您的反向打印循环中,您的索引是错误的:

for(i = strlen(str); i > -1; i--){

通过上述内容,您尝试为str[i]打印i = strlen(str),但这是有效字符串数据末尾的for(i = strlen(str) - 1; i > -1; i--){ 。改为:

{{1}}

答案 4 :(得分:0)

问题在于您没有分配

char *str

你需要做的是

1)

char *str = malloc(sizeof(char) * 100);

然后当你不再使用它时:

free(str)

2)

char str[100];