可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
Right now I'm trying this:
#include <stdio.h>
int main(int argc, char *argv[]) {
if (argc != 3) {
printf("Usage: %s %s sourcecode input", argv[0], argv[1]);
}
else {
char source[] = "This is an example.";
int i;
for (i = 0; i < sizeof(source); i++) {
printf("%c", source[i]);
}
}
getchar();
return 0;
}
This does also NOT work:
char *source = "This is an example.";
int i;
for (i = 0; i < strlen(source); i++){
printf("%c", source[i]);
}
I get the error
Unhandled exception at 0x5bf714cf (msvcr100d.dll) in Test.exe: 0xC0000005: Access violation while reading at position 0x00000054.
(loosely translated from german)
So what's wrong with my code?
回答1:
You want:
for (i = 0; i < strlen(source); i++){
sizeof gives you the size of the pointer, not the string. However, it would have worked if you had declared the pointer as an array:
char source[] = "This is an example.";
but if you pass the array to function, that too will decay to a pointer. For strings it's best to always use strlen. And note what others have said about changing printf to use %c. And also, taking mmyers comments on efficiency into account, it would be better to move the call to strlen out of the loop:
int len = strlen( source );
for (i = 0; i < len; i++){
or rewrite the loop:
for (i = 0; source[i] != 0; i++){
回答2:
One common idiom is:
char* c = source;
while (*c) putchar(*c++);
A few notes:
- In C, strings are null-terminated. You iterate while the read character is not the null character.
*c++
increments c
and returns the dereferenced old value of c
.
printf("%s")
prints a null-terminated string, not a char. This is the cause of your access violation.
回答3:
sizeof(source)
returns the number of bytes required by the pointer char*
. You should replace it with strlen(source)
which will be the length of the string you're trying to display.
Also, you should probably replace printf("%s",source[i])
with printf("%c",source[i])
since you're displaying a character.
回答4:
- sizeof() includes the terminating null character. You should use strlen() (but put the call outside the loop and save it in a variable), but that's probably not what's causing the exception.
- you should use "%c", not "%s" in printf - you are printing a character, not a string.
回答5:
This should work
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]){
char *source = "This is an example.";
int length = (int)strlen(source); //sizeof(source)=sizeof(char *) = 4 on a 32 bit implementation
for (int i = 0; i < length; i++)
{
printf("%c", source[i]);
}
}
回答6:
Rather than use strlen as suggested above, you can just check for the NULL character:
#include <stdio.h>
int main(int argc, char *argv[])
{
const char *const pszSource = "This is an example.";
const char *pszChar = pszSource;
while (pszChar != NULL && *pszChar != '\0')
{
printf("%s", *pszChar);
++pszChar;
}
getchar();
return 0;
}
回答7:
sizeof(source)
is returning to you the size of a char*
, not the length of the string. You should be using strlen(source)
, and you should move that out of the loop, or else you'll be recalculating the size of the string every loop.
- By printing with the
%s
format modifier, printf
is looking for a char*
, but you're actually passing a char
. You should use the %c
modifier.
回答8:
Replace sizeof with strlen and it should work.
回答9:
sizeof(source)
returns sizeof a pointer as source is declared as char *.
Correct way to use it is strlen(source)
.
Next:
printf("%s",source[i]);
expects string. i.e %s expects string but you are iterating in a loop to print each character. Hence use %c.
However your way of accessing(iterating) a string using the index i is correct and hence there are no other issues in it.
回答10:
Just change sizeof with strlen.
Like this:
char *source = "This is an example.";
int i;
for (i = 0; i < strlen(source); i++){
printf("%c", source[i]);
}
回答11:
You need a pointer to the first char to have an ANSI string.
printf("%s", source + i);
will do the job
Plus, of course you should have meant strlen(source)
, not sizeof(source)
.