语言c char *从第二个元素而不是第一个元素开始

用户7454975

我们在大学里创建了该程序,该程序通过使用语言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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

当第二个元素是X时,C ++ Map获得第一个元素

c ++-如果用作map中的键,如何获取对的第一个和第二个元素?

C语言中的第一个和第二个调用

在c#中使用固定的第一个元素和第二个变量元素拆分字符串

拆分字符串,并连接所有第一个元素,然后连接第二个元素,依此类推,在c#中

在C中按对的第一个元素然后按对的第二个元素对对的向量进行排序

C第一个fgets()在第二个运行时被跳过

如何从第二个结构访问第一个结构-C

TCP write()向其自身输出char *,而不是仅在第一个套接字连接上进行缓冲,但在第二个连接开始时可以正常工作

以历史方式比较 2 个列表之间的值,如果元素来自第一个列表则递增值,如果元素来自第二个列表则递减 - C#

尝试引用char *中的第一个元素时,C中出现分段错误

为什么将\ 0定义为C中char数组的第一个元素?

删除 Char * Array Objective C 中的第一个元素

C:无法检测到char的第一个元素

C#合并两个for循环,第二个循环是第一个倒置

数组分配中的 C++ 堆内存只会弄乱第一个数组而不是第二个数组

在 C# 中关闭第一个表单以显示第二个,但在关闭第二个后第一个又回来了

通过第一个对象在 C++ 中创建第二个对象时,第一个对象去哪里了?

在第二个条目C#中使用第一个条目的ID

c ++ 11获取第一个(第二个,等等)参数的类型,类似于result_of

在C ++中,如何仅在第一个“ system()”结束后才执行第二个“ system()”?

C#第二个DateTime.ParseExact检查第一个是否失败

目标 C - 如何在触摸第一个 SKnode 时禁用第二个 Sknode 的触摸

第一个字符串以 Racket 语言中的第二个字符串开头

数组返回第一个元素char而不是整个元素

如何在 C# 中组合两个项目(从 1ts 项目打开第二个项目和从第二个项目打开第一个项目)

为什么第一个C代码导致一个变量,而第二个代码导致3个变量。是否可以通过稍作更改使第一个程序工作?

如何按第一个和第二个索引对 C++ 中的二维向量进行排序?

在C ++中访问映射中的一对的第一个和第二个时出现编译器错误