我们在大学里创建了该程序,该程序通过使用语言c的地址创建了一个字符数组。但是第一个元素(char * str)输出一个奇怪的空间。我看过一些有关字符数组的教程,其中第一个元素是我们键入的第一个字符。
那为什么会这样呢?他们在某些情况下会发生这种情况吗?如果是这样,我如何知道我的字符串是从第一个元素还是第二个元素开始,而不必每次都使用printf?
这是我的程序
#include<stdio.h>
#include<stdlib.h>
char* newStr(int n);
int length(char* str);
int main() {
int n,i;
printf("Number of characters \n");
scanf("%d",&n);
char* str = newStr(n);
char* c = malloc(n*sizeof(char)+1);
c=str;
// check that c[0]=' ' and c[n+1]=\0
for(i=0;i<=n+1;i++) printf("*(str+%d) = %c \n",i,*(c+i));
return 0;
}
char* newStr(int n) {
int i;
char* c;
c=malloc(n*sizeof(char)+1);
printf("Enter a word of %d characters \n",n);
for(i=0;i<=n;i++) {scanf("%c",(c+i));}
*(c+n+1)='\0';
return c;
}
int length(char* str) {
int i=0;
while(*(str+i)!='\0'){i++;}
return i-1;
}
这是输出
Number of characters
5
Enter a word of 5 characters
hello
*(str+0) =
*(str+1) = h
*(str+2) = e
*(str+3) = l
*(str+4) = l
*(str+5) = o
*(str+6) =
The length of your string is 5
有人可以用简单的术语向我解释一下吗,因为我是c的新手。提前致谢
已经有人在评论中回答说scanf()函数不占用结尾的换行符char。
因此,如果用户在键盘上按下“ Enter”键,然后在代码中出现scanf(),则该Enter键将被记录。
另外,我想将您的注意力集中在newStr()函数上。在那里,您为新字符串分配空间,并将其存储在动态字符数组中,即char * c,然后返回该指针。
但是在您的main()中,您将返回值保存在str中,并且由于某种原因试图将其复制到另一个指针(顺便做错了)?
char* str = newStr(n);
char* c = malloc(n*sizeof(char)+1);
c=str;
str已经是可以使用的字符串,无需在char * c上创建另一个malloc。当你写c = str时;您实际上是在给char * c分配str的地址,而不是str所指向的值,因此编写了以下代码行:
char* c = malloc(n*sizeof(char)+1);
完全没用,并且容易出错,因为丢失地址后,您将无法再释放该指针。
我不知道我是否清楚...
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句