我正在自学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.这很好,但是在哪里锹符号来自?为什么只打印其中一个?
对我来说很明显,我对这里发生的事情有一些根本的误解,我无法在其他地方找到任何这方面的例子。任何人都可以解释这里出了什么问题吗?
答案 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];