试图编写一些基本的子手代码来练习学习C,但是我似乎无法更改程序中的单个字符
int main(int argc, char *argv[]) {
int length, a, x;
x = 0;
char gWord[100];
char word[100] = "horse";
length = strlen(word) - 1;
for(a = 0; a<= length; a = a + 1){
gWord[a] = "_";
printf("%s", gWord[a]);
}
printf("%s", gWord);
}
当我尝试运行此命令时,它每次循环时都会打印(空)。这可能是一个基本修复程序,但是我是C语言的新手,无法在线找到任何相关信息
答案 0 :(得分:6)
要打印字符而不是更改字符串:
printf("%s", gWord[a]);
收件人:
printf("%c", gWord[a]);
但在此更改之前:
gWord[a] = "_";
收件人:
gWord[a] = '_';
最后一个问题是您正在将字符串文字分配给单个字符。
正如@ 4386427所指出的那样,在以后使用gWord
打印printf("%s", gWord)
之前,您永远不要将printf("%s", gWord);
终止于零。您应将最后一行从以下位置更改:
gWord[a] = '\0';
printf("%s", gWord);
收件人:
xml
因为否则很可能导致缓冲区溢出。
答案 1 :(得分:2)
此行
printf("%s", gWord[a]);
必须
printf("%c", gWord[a]);
要打印字符, c 是正确的说明符。 s 仅适用于整个字符串,并采用char指针。
答案 2 :(得分:1)
编译代码时是否收到任何警告消息?
由于您正在学习C语言,因此有一个建议-不要忽略编译器给出的任何警告消息,它们出于某种原因而存在。
代码中的三个问题:
第一:
为字符分配字符串:
gWord[a] = "_";
gWord
是100
个字符的数组,而gWord[a]
是a
数组中位置gWord
的字符。相反,您应该
gWord[a] = '_';
第二:
使用错误的格式说明符来打印字符:
printf("%s", gWord[a]);
^^
要打印字符,应使用%c
格式说明符:
printf("%c", gWord[a]);
第三:
错过了在gWord
末尾添加空终止符并打印的问题:
printf("%s", gWord);
在C语言中,字符串实际上是一维字符数组,以空字符'\ 0'终止。 %s
格式说明符用于字符串,默认情况下会打印字符,直到遇到结尾的空字符为止。因此,您应该确保在'\0'
循环完成后,在gWord
的末尾添加for
:
gWord[a] = '\0';
除了这些之外,还有其他几件事-
这句话:
length = strlen(word) - 1;
我没有发现从1
长度中减去word
的任何原因。 strlen
返回字符串的长度,但不包括结尾的空字符本身。因此,strlen(word)
将给出输出5
。现在,您将从此循环中减去1
并运行循环,直到<= length
可能会使代码阅读者感到困惑。您应该简单地做:
length = strlen(word);
for(a = 0; a < length; a = a + 1){
....
....
此外,返回类型strlen()
是size_t
,而size_t
是无符号类型。因此,您应该使用类型size_t
的变量来接收strlen()
的返回值。
最后但并非最不重要的一点是,请确保程序中没有任何未使用的变量/参数。您不在程序中的任何地方使用argc
和argv
。如果您使用的是gcc
编译器,请使用-Wall -Wextra
选项对其进行编译。您会发现编译器将报告所有未使用的变量/参数。因此,如果不使用argc
和argv
,则只需在void
函数的参数列表中输入main()
。
将所有内容放在一起,您可以执行以下操作:
#include <stdio.h>
#include <string.h>
int main(void) {
size_t length, a;
char gWord[100];
char word[100] = "horse";
length = strlen(word);
for(a = 0; a < length; a = a + 1) {
gWord[a] = '_';
printf("%c", gWord[a]);
}
gWord[a] = '\0';
printf ("\n");
printf("%s\n", gWord);
return 0;
}
答案 3 :(得分:0)
从语法上讲,您的代码没问题@Blookey。但逻辑上,实际上没有。
让我指出导致代码中不良行为的3个地方:
gWord[a] = "_";
遵守这一行。您已在“” 中指定了_
。如果您不知道这一事实,则字符串的每个单独元素都是一个字符。并且每个字符应该以''给出,即单引号而不是双引号。 printf("%s", gWord[a]);
再次出现类似错误。 gWord[a]
是一个字符,而不是字符串。因此,您需要使用格式说明符%c
而不是用于字符串的%s
来打印它。一个字符串,任何字符串都应以NULL结尾,即 \0
(反斜杠零)。这就是区别字符数组和字符串的原因。因此,一旦将字符加载到gWord[]
中,就只需添加以下行。
gWord[a] = '\0';
这是完整的代码,仅作以下三个更改:
#include<stdio.h>
#include<string.h>
int main(int argc, char *argv[]) {
int length, a, x;
x = 0;
char gWord[100];
char word[100] = "horse";
length = strlen(word) - 1;
for(a = 0; a<= length; a = a + 1){
gWord[a] = '_';
printf("%c ", gWord[a]);
}
gWord[a] = '\0';
printf("\n%s", gWord);
}
这是输出:
_ _ _ _ _。
_____。
答案 4 :(得分:0)
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
int main(int argc, char *argv[]) {
int length, a, x;
x = 0;
char gWord[100] = {0};
char word[100] = "horse"; /*note that if the array in place strlen +1 is not nulled before using strlen you might not get the correct result*/
length = strlen(word) - 1;/*strln will return 5, that is the letters inn the string the pointer is pointing to until the first terminator '\0'*/
for(a = 0; a<= length; a = a + 1){
gWord[a] = '_'; /* if you use "_" it will try to fit in the chars '_' and '\0' to each char slot of the array*/
printf("%c", gWord[a]); /* %s looks for a string to print while here there are single chars to print*/
}
printf("\n");/*you can print the hole string like this */
printf("%s", gWord);
return 0;/*and remember that main function should always have a return value*/
}