在通过scanf读取c中的两个数组时,第二个数组以某种方式修改了第一个数组
我在通过scanf在通过scanf读取c中的两个数组时,第二个数组以某种方式修改了第一个数组,c,string,input,scanf,C,String,Input,Scanf,我在通过scanfscanf读取两个字符串时遇到以下问题:我插入了第一个字符串,一切正常,但插入第二个字符串后,第一个字符串发生了变化 #include<stdio.h> #define N 6 #define K 2 int main(){ char a[N]; char b[K]; int i = 0,j=0; printf("first word\n\n\n"); scanf("%s", a); for(i = 0; i &l
scanf
读取两个字符串时遇到以下问题:我插入了第一个字符串,一切正常,但插入第二个字符串后,第一个字符串发生了变化
#include<stdio.h>
#define N 6
#define K 2
int main(){
char a[N];
char b[K];
int i = 0,j=0;
printf("first word\n\n\n");
scanf("%s", a);
for(i = 0; i <= N; i++){
printf("%c", a[i]);
}
printf("second word \n\n\n");
scanf("%s", b);
for(i = 0; i <= N; i++){
printf("%c", a[i]);
}
}
#包括
#定义n6
#定义k2
int main(){
字符a[N];
字符b[K];
int i=0,j=0;
printf(“第一个单词\n\n\n”);
scanf(“%s”,a);
对于(i=0;i您正在打印a
两次,将第二个printf(“%c”,a[i]);
更改为printf(“%c”,b[i]);
您正在打印a
两次,将第二个printf(“%c”,a[i]);
更改为printf(“%c”,b[i];
对于第二个printf您必须编写
printf("%c", b[i]);
对于第二个printf
,您必须编写
printf("%c", b[i]);
根据您提到的输入(abcabc和abc),您提供给scanf的输入导致变量a和b溢出,
您应该输入长度为5的字符串作为第一个字符串,长度为1的字符串作为第二个字符串,并为这两个字符串保留空间\0
编辑:根据您向scanf提供的输入(abcabc和abc),将循环条件从i更改为导致变量a和b溢出,
您应该输入长度为5的字符串作为第一个字符串,长度为1的字符串作为第二个字符串,并为这两个字符串保留空间\0
编辑:同时将循环条件从i更改为开始,您将打印数组a
两次;似乎您的意思是使用第二个循环打印b
。但是循环中存在一个问题。它们超出了数组边界。由于数组在C中为零索引,因此您需要:
for (i = 0; i < N; i++) {}
对于b
但即使这样也不完全正确,因为输入字符串可能不会完全填充数组。当到达空终止符或数组末尾时,您确实需要终止循环:
for (i = 0; a[i] != '\0' && i < N; i++) {}
首先,您要打印两次数组a
;似乎您想用第二个循环打印b
。但是循环中有一个问题。它们超出了数组边界。由于数组在C中为零索引,您需要:
for (i = 0; i < N; i++) {}
对于b
但即使这样也不完全正确,因为输入字符串可能不会完全填充数组。当到达空终止符或数组末尾时,您确实需要终止循环:
for (i = 0; a[i] != '\0' && i < N; i++) {}
您遇到的问题是,由于未能确保字符串以nul结尾,并且使用了有关b
的错误限制,因此调用了未定义的行为
#define N 6
#define K 2
...
char a[N], b[K];
a
可以容纳总共5个字符
+nul终止符,而对于总共6个字符
b
而言,只能容纳总共1个字符
+nul终止符
当您随后使用for(i=0;i循环a
和b
时,您遇到的问题是,您调用未定义的行为时没有确保字符串以nul结尾,并且使用了关于b
的不正确限制。例如,您
#define N 6
#define K 2
...
char a[N], b[K];
a
可以容纳总共5个字符
+nul终止符,而对于总共6个字符
b
而言,只能容纳总共1个字符
+nul终止符
当您随后使用for(i=0;i循环a
和b
时,我看到您可以在这里执行两件事:
使用另一个将加载数据的大缓冲区数组,并将数据复制到specyfic数组。这样,在a[]中,第一个字最多可以有6个字母,在b[]中,第二个字最多可以有2个字母。但您可以加载2个字
Scanf在评论中提到的@xing等特殊字符数量
scanf(“%6s”,word)
//一般用途,不适用于OP
比设置的字号更长时,剩下的输入将作为第二个字号的输入。我看到您可以在这里做两件事:
使用另一个将加载数据的大缓冲区数组,并将数据复制到specyfic数组。这样,在a[]中,第一个字最多可以有6个字母,在b[]中,第二个字最多可以有2个字母。但您可以加载2个字
Scanf在评论中提到的@xing等特殊字符数量
scanf(“%6s”,word)
//一般用途,不适用于OP
当你的字数比你设置的字数长时,你将把剩下的输入作为第二个字的输入。你为两个scanf输入了什么?“显然是我在数组维数方面尝试的输入。”--这是真的吗?for(I=0;I可能for(I=0;a[I]&&I
@Pras、abcabc和abc。这些输入不考虑数组的尺寸。请参阅;当使用%s
和scanf()
时,应始终指定最大宽度,以避免缓冲区溢出。您为两个scanf输入了哪些输入?“显然是我在考虑数组尺寸时尝试的输入。”--这是真的吗?for(i=0;i可能for(i=0;a[i]&&i
@Pras、abcabc和abc。这些输入不考虑数组维度。请参见;在使用%s
和scanf()
时,应该始终指定最大宽度,以避免缓冲区溢出。另外,最好改为:for(i=0;i用于a
,和:用于b
以避免未定义的行为。你是对的,我没有注意到。另外,最好改为:用于(i=0;i
用于a
,和:用于(i=0;i
用于b
以避免未定义的行为。你说得对,我没有注意到这一点。这无关紧要,因为OP循环无论如何都会超出数组边界……True,added and edit
#include <stdio.h>
#define N 6
#define K 2
int main (void ) {
char a[N], b[K];
int i = 0/*, j = 0*/;
printf ("enter first word: ");
if (scanf ("%5s", a) != 1) {
fprintf (stderr, "error: invalid input - a.\n");
return 1;
}
for (i = 0; a[i] && i < N; i++)
printf ("%c", a[i]);
putchar ('\n');
printf ("enter second word: ");
if (scanf ("%1s", b) != 1) {
fprintf (stderr, "error: invalid input - b.\n");
return 1;
}
for (i = 0; b[i] && i < N; i++)
printf ("%c", b[i]);
putchar ('\n');
return 0;
}
$ ./bin/twowords
enter first word: cats
cats
enter second word: dogs
d