一维数组
代码
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1010;
char str[N];
char st[N];
char s1[N];
char s2[N];
/*
abcde
abcde
abcde
abcde
*/
int main(){
scanf("%s",&str+1);
scanf("%s",st+1);
scanf("%s",&s1);
scanf("%s",s2);
for(int i=0;i<=5;i++){
cout<<i<<"\t";
}
cout<<endl;
cout<<"str--------------------------------"<<endl;
for(int i=0;i<=5;i++){
cout<<str[i]<<"\t";
}
cout<<endl;
cout<<"st---------------------------------"<<endl;
for(int i=0;i<=5;i++){
cout<<st[i]<<"\t";
}
cout<<endl;
cout<<"s1---------------------------------"<<endl;
for(int i=0;i<=5;i++){
cout<<s1[i]<<"\t";
}
cout<<endl;
cout<<"s2---------------------------------"<<endl;
for(int i=0;i<=5;i++){
cout<<s2[i]<<"\t";
}
cout<<endl;
return 0;
}
得到的输出
可见str的赋值失败了...
结论
在C语言中,scanf函数用于从标准输入(通常是键盘)读取输入数据。对于字符串,scanf使用%s格式说明符来读取字符串。
当你使用scanf("%s", st+1);
时,str+1表示从字符串st的第二个字符开始的地址。这种写法是合法的,因为C语言中,字符串实际上是一个字符数组,st+1指向该数组的第二个元素的地址。
不需要使用&取地址符的原因是,数组名本身就代表了数组的起始地址,因此str+1已经是一个地址值,不需要再使用&取地址。
二维数组
对于二维字符数组的赋值,有几种常见的方法:
- 使用字符串字面值进行初始化:
char arr[][6] = {"Hello", "World", "C语言"};
- 使用scanf函数逐个读取字符串:
char arr[3][20];
for(int i=0; i<3; i++) {
scanf("%s", arr[i]);
}
- 使用strcpy函数复制字符串:
char arr[3][20];
char *temp[] = {"Hello", "World", "C语言"};
for(int i=0; i<3; i++) {
strcpy(arr[i], temp[i]);
}
- 使用fgets函数从文件或标准输入读取字符串(保留换行符):
char arr[3][20];
for(int i=0; i<3; i++) {
fgets(arr[i], sizeof(arr[i]), stdin);
}
- 使用gets函数从标准输入读取字符串(不建议使用,容易导致缓冲区溢出):
char arr[3][20];
for(int i=0; i<3; i++) {
gets(arr[i]);
}
无论使用哪种方式赋值,都需要注意字符串长度不要超过数组的大小,否则可能会导致缓冲区溢出和未定义的行为。同时,也要考虑是否需要为字符串留出额外的空间,以容纳字符串结束符'\0'。
标签:字符,arr,int,scanf,char,数组,字符串,赋值 From: https://blog.csdn.net/Hong_DWYJ/article/details/137377583